词法作用域
大部分的语言都是词法作用域,包括js,词法作用域是一套关于引擎如何寻找变量以及会在何处找到变量的规则。词法作用域最重要的特征是它的定义过程发生在代码的书写阶段
function foo() {
console.log(a) //2
}
function bar() {
var a=3;
foo();
}
var a = 2;
bar();
词法作用域让foo()中的a通过RHS引用到了全局作用域中的a,因此会输出2。
动态作用域
动态作用域并不关心函数和作用域是如何声明以及在何处声明的,只关心它们从何处调用。换句话说,作用域链是基于调用栈的,而不是代码中的作用域嵌套。
this机制某种程度上很像动态作用域。但是箭头函数里的this反而像词法作用域
总结:
词法作用域是在写代码或者说定义时确定的,而动态作用域是在运行时确定的。词法作用域关注函数在何处声明,而动态作用域关注函数从何处调用。