作用域链是JavaScript中非常重要的概念,它决定了代码中变量的查找方式。在JavaScript中,作用域链是由多个环节组成的,每个环节都是一个作用域,当查找变量时,JavaScript引擎会按照作用域链的顺序逐个查找,直到找到变量或者到达全局作用域。
在JavaScript中,全局作用域是最外层的作用域,所有不在函数内声明的变量都会成为全局作用域的变量。
var a = 1; function test() { console.log(a); } test(); // 输出1
在上面的代码中,全局作用域中声明了变量a,而函数test中没有声明变量a,因此在函数中查找变量a时,会沿着作用域链一直向上寻找,最终找到全局作用域中的变量a。
除了全局作用域,JavaScript还有局部作用域。在函数内部声明的变量就是局部变量,只能在函数内部访问。
function test() { var a = 1; console.log(a); } test(); // 输出1 console.log(a); // 报错:a未定义
在上面的代码中,变量a是在函数内部声明的,因此它只能在函数内部访问。在函数外部访问变量a时,会报错。
在JavaScript中,变量的查找是按照作用域链的顺序进行的。当在一个作用域内查找变量时,如果没有找到,JavaScript引擎会沿着作用域链向上查找,直到找到变量或者到达全局作用域。如果在全局作用域中还没有找到变量,那么变量就是未定义的。
var a = 1; function test() { var b = 2; function innerTest() { var c = 3; console.log(a, b, c); } innerTest(); } test(); // 输出1 2 3
在上面的代码中,变量a是在全局作用域中声明的,变量b是在函数test的作用域中声明的,变量c是在函数innerTest的作用域中声明的。当在函数innerTest中查找变量时,JavaScript引擎会先在当前作用域中查找,如果没有找到,就沿着作用域链向上查找。最终,JavaScript引擎会找到全局作用域中的变量a。
在JavaScript中,函数的参数也有作用域。函数的参数相当于在函数内部声明了变量,只不过这个变量的值是由函数外部传入的。
function test(a, b) { console.log(a, b); } test(1, 2); // 输出1 2
在上面的代码中,函数test的参数a和b相当于在函数内部声明了变量a和变量b。当调用函数test时,变量a和变量b的值是由函数外部传入的。
总结一下,JavaScript中的作用域链是由多个环节组成的,每个环节都是一个作用域。当查找变量时,JavaScript引擎会按照作用域链的顺序逐个查找,直到找到变量或者到达全局作用域。函数的参数也有作用域,相当于在函数内部声明了变量,只不过这个变量的值是由函数外部传入的。
本文为翻滚的胖子原创文章,转载无需和我联系,但请注明来自猿教程iskeys.com