JavaScript 作用域链

JavaScript 是基于词法作用域的语言。

全局变量在程序中始终都是有定义的。局部变量在声明它的函数体内以及其所嵌套的函数内始终是有定义的。

每一段 JavaScript 代码(全局代码或函数),都有一个与之关联的作用域链(ScopeChain)。这个作用域链是一个对象列表或者链表,这组对象定义了这段代码“作用域”中的变量。当 JavaScript 需要查找变量 x的值的时候(即变量解析 variableresolution),它会从链中的第一个对象开始查找,如果这个对象有一个名为 x 的属性,则会直接使用这个属性的值,如果第一个对象中不存在名为 x 的属性,则会继续查找 下一个对象,以此类推。如果作用域链上没有任何一个对象含有属性 x,则会认为这段代码的作用域中不存在 x , 并抛出一个引用错误 ReferenceError 异常。

JavaScript 最顶层代码中, 作用域链由一个全局对象组成。在不包含嵌套的函数体内,作用域链上有两个对象,第一个是定义函数参数和局部变量的对象,第二个是全局对象。在一个嵌套的函数体内,作用域链链上至少有三个对象。

最后更新于