JavaScript中的作用域链是指在函数内部查找变量时所形成的链式结构。
当函数被调用时,会创建一个新的执行上下文,并将该执行上下文的作用域链指向当前函数的[[Scope]]属性所保存的作用域链。
作用域链的顶端是当前执行上下文的变量对象,底端是全局执行上下文的变量对象。
当函数内部查找变量时,会先查找当前执行上下文的变量对象,如果找不到,则会顺着作用域链向上查找,直到找到该变量或者到达作用域链的底端。
如果在全局执行上下文中仍然找不到该变量,则会抛出ReferenceError异常。
let a = 'global';
function foo() {
let b = 'local';
console.log(a); // 'global'
console.log(b); // 'local'
}
foo();
在上述示例代码中,当函数foo内部查找变量b时,会先查找当前执行上下文的变量对象,即foo函数的变量对象,由于该变量对象中包含了变量b,因此可以找到该变量。
而当函数foo内部查找变量a时,会顺着作用域链向上查找,直到找到全局执行上下文的变量对象,由于该变量对象中包含了变量a,因此可以找到该变量。