JavaScript 作用域链解析是指在当前作用域中查找变量时,如果找不到,就会沿着作用域链向上一层层查找,直到找到该变量或者到全局作用域仍未找到为止。
在 JavaScript 中,每个函数都有自己的作用域,即函数作用域。在函数内部定义的变量,只能在该函数内部访问,不能在函数外部访问。如果在函数外部使用该变量,就会抛出 ReferenceError 异常。
当某个变量在函数内部没有被定义时,JavaScript 引擎会沿着作用域链向上查找该变量。在查找变量时,引擎会先查找当前函数作用域内的变量,如果找不到,再沿着作用域链向上查找,直到找到或者到全局作用域仍未找到为止。
以下是两个示例说明:
- 函数内部定义变量与全局变量同名,查找顺序会先在函数作用域中查找
var name = 'Tom';
function printName() {
var name = 'Jerry';
console.log(name); // 输出 'Jerry'
}
printName();
在上面的代码中,定义了一个全局变量 name
,在 printName()
函数中又定义了一个同名变量 name
,那么当在函数内部访问 name
时,优先在函数作用域中查找,因此输出的是 'Jerry'
。
- 在嵌套的函数内部查找变量时,会先在语法上最近的函数作用域中查找
var x = 10;
function outer() {
var x = 20;
function inner() {
console.log(x); // 输出 20
}
inner();
}
outer();
在上面的代码中,定义了一个全局变量 x
,在 outer()
函数中又定义了一个同名变量 x
。然后在 outer()
中定义了一个函数 inner()
,并在 inner()
函数中访问变量 x
。在此情况下,当在 inner()
函数中查找变量 x
的时候,会先在 inner()
函数作用域中查找,由于 inner()
函数中并没有定义变量 x
,因此继续沿着作用域链查找,这时会在语法上最近的函数作用域 outer()
中找到同名变量,并输出其值 20
。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript 作用域链解析 - Python技术站