作用域链是JavaScript中的一个非常重要的概念,用于描述在代码执行期间变量和函数的查找规则。当JavaScript引擎在执行代码时,每个函数都会创建自己的执行环境,执行环境中包含着当前函数的变量和函数声明。当JavaScript引擎需要查找某个变量或函数时,它会先在当前执行环境中查找,如果找不到,就会沿着作用域链向上查找,直到找到为止。
作用域链的构建是在函数定义时就已经确定的。当一个函数被定义时,它会记录下它的词法作用域,即在它定义时所处的作用域链。当函数被调用时,它会创建一个新的执行环境,并将该执行环境的作用域链设置为函数定义时的作用域链。这样,当函数内部需要查找某个变量时,JavaScript引擎就可以沿着该作用域链向上查找。
以下是一个作用域链的示例代码:
function outerFunction() {
const outerVar = 'I am in the outer function';
function innerFunction() {
const innerVar = 'I am in the inner function';
console.log(innerVar); // 输出:I am in the inner function
console.log(outerVar); // 输出:I am in the outer function
console.log(globalVar); // 报错:globalVar is not defined
}
innerFunction();
}
const globalVar = 'I am a global variable';
outerFunction();
在这个示例中,innerFunction中可以访问到innerVar和outerVar变量,这是因为innerFunction的作用域链包含了innerVar所在的作用域和outerVar所在的作用域。当innerFunction需要访问变量时,JavaScript引擎首先在innerFunction的执行环境中查找,如果找不到,就沿着作用域链向上查找,最终找到了outerVar所在的作用域。
另外,当innerFunction需要访问globalVar变量时,由于globalVar不在它的作用域链中,JavaScript引擎无法找到它,因此会抛出一个错误。