作用域链

it2022-05-05  131

可以发现只有函数可以制造作用域结构. 那么只要是代码, 至少有一个作用域, 即全局作用域. 凡是代码中有函数, 那么这个函数就构成另一个作用域. 如果函数中还有函数, 那么再这个作用域中就又可以诞生一个作用域. 那么将这样的所有的作用域列出来, 可以有一个结构: 函数内指向函数外的链式结构.

绘制作用域链的步骤:1. 看整个全局是一条链, 即顶级链, 记为 0 级链2. 看全局作用域中, 有什么成员声明, 就以方格的形式绘制到 0 级练上3. 再找函数, 只有函数可以限制作用域, 因此从函数中引入新链, 标记为 1 级链4. 然后在每一个 1 级链中再次往复刚才的行为

变量的访问规则1. 首先看变量在第几条链上, 在该链上看是否有变量的定义与赋值, 如果有直接使用2. 如果没有到上一级链上找( n - 1 级链 ), 如果有直接用, 停止继续查找. 3. 如果还没有再次往上刚找... 直到全局链( 0 级 ), 还没有就是 is not defined4. 注意, 切记 同级的链不可混合查找

例如:``` function f1() { function f2() { } } var num = 456; function f3() { function f4() { } }```

绘制作用域链``` function f1() { var num = 123; function f2() { console.log( num ); } f2(); } var num = 456; f1();

 

# 注意1. 声明变量使用 var, 如果不使用 var 声明的变量就是全局变量( 禁用 )2. 因为在任何代码结构中都可以使用该语法. 那么再代码维护的时候会有问题. 所以除非特殊原因不要这么用.3. 下面的代码的错误``` function foo () { var i1 = 1 // 局部 i2 = 2, // 全局 i3 = 3; // 全局 }

 

转载于:https://www.cnblogs.com/yanghaot/p/5743126.html


最新回复(0)