JavaScript中的作用域链
-
在 JavaScript 中, 作用域为可访问变量,对象,函数的集合。
-
变量的作用域分为:全局作用域和局部作用域
-
由多个执行上下文的变量对象构成的链表就叫做作用域链
-
函数在执行的过程中,先从自己内部找变量,如果找不到,会逐层向上寻找
-
注意:找的是变量的当前状态
-
demo01
var a = 1 // ① function fn1() { function fn3() { function fn2() { console.log(a) // ⑤ -> 由于本作用域没有声明a,因此向上一级作用域寻找a,即var a=2,输出2 } fn2() // ④ var a = 4 // ⑥ } var a = 2 // ② return fn3 // ③ } var fn = fn1(); fn();
- demo02
var a = 1 // ① function fn1() { function fn2() { console.log(a); // ⑥ -> 执行到此步时没有声明a, 则在上一作用域中寻找,var a = 2, 输出2 } function fn3() { var a = 4; // ④ fn2(); // ⑤ } var a = 2 // ② return fn3 // ③ } var fn = fn1(); fn();
- demo03
var a = 1 // ① function fn1() { function fn3() { var a = 4 // ④ fn2(); // ⑤ } var a = 2 // ② return fn3 // ③ } function fn2() { console.log(a) // // ⑥ -> 执行到此步时没有声明a, 则在上一作用域中寻找,var a = 1, 输出1 } var fn = fn1() fn()
- demo04
var a = 1 // ① function fn1(){ function fn3(){ function fn2(){ console.log(a) // // ⑥ -> 执行到此步时没有声明a, 则在上一作用域中寻找,var a, 声明但是未赋值,输出undefined } var a; // ④ fn2(); // ⑤ a = 4 } var a = 2 // ② return fn3 // ③ } var fn = fn1() fn()