动态作用域、词法作用域
javascript的作用域就是词法作用域,事实上大部分的语言都是基于词法作用域
词法作用域:是一套关于引擎如何寻找变量以及会在何处找到变量的规则,
词法作用域:最重要的特征是他的定义过程发生在代码的书写阶段(假设你没有使用eval()或 with)
动态作用域似乎暗示有很好的理由让作用域作为一个在运行时就被动态确定的形式,而不是在写代码的时进行静态确定的形式,事实上也是这样的,例子说明
function foo () {
console.log(a)
}
function bar () {
var a = 3
foo()
}
var a = 2
bar()
这个代码最终的输出是 2
因为词法作用域:是在代码或者说定义时确定的,而动态作用域:是在运行时候确定的(this也是),
词法作用域:关注函数在何处声明, 而动态作用域:关注函数在何处调用
词法作用域让foo()中的a通过rhs引用到了全局变量中的a,因此会输出2
如果是动态作用域的话,当foo()无法找到a的变量引用时,会顺着调用栈在调用foo()的地方查找a, 而不是在嵌套的词法作用域链中向上查找,由于foo()是在bar()中调用的,引擎会检查bar()的作用域 ,所以要是是动态作用域的话输出的a的值就是3