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

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

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

例如:
```
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; // 全局

}

 

posted on 2016-08-06 00:12  如果在这样  阅读(165)  评论(0编辑  收藏  举报