1.作用域链:只有函数可以制造作用域结构,所以只要是代码就至少有一个作用域(即全局作用域)
(1)凡是代码中有函数,那么这个函数就构成另一个作用域。如果函数中还有函数,那么在这个作用域中又可以诞生一个作用域。将这样的所有作用域列出来,可以有一个结构:函数内指向函数外的链式结构,就称作作用域链
(2)只要是函数就可以创造作用域
函数中又可以再创建函数
函数内部的作用域可以访问函数外部的作用域
如果有多个函数嵌套,那么就会构成一个链式访问结构 --> 作用域链
//f1 --> 全局
function
f1
(){
//f2 --> f1 --> 全局
function
f2
(){
//f3 --> f2 --> f1 --> 全局
function
f3
(){
}
//f4 --> f2 --> f1 --> 全局
function
f4
(){
}
}
//f5 --> f1 --> 全局
function
f5
(){
}
}
2.绘制作用域链图
function
f1
(){
function
f2
(){
}
}
var
num =
456
;
function
f3
(){
function
f4
(){
}
}
(1)绘制作用域链的步骤
·看整个全局是一条链,即顶级连,记为0链
·看全局作用域中有什么变量和函数声明就以方格的形式绘制到0级链上
·再找函数,只有函数可以限制作用域,因此从函数中引入新链,标记为1级链
·然后在每一个1级链中再次往复以上的行为
(2)变量的访问规则
·首先看变量在第几条链上,在该链上看是否有变量的定义与赋值,如果有就直接使用
·如果没有到上一级链上找(n - 1级链),如果有就直接用,停止继续查找
·如果还没有再次网上查找,知道全局链(0级),如果还是没有就是is not defined
·注意:同级的链不可混合查找
3.注意点
(1)并不是在函数内部写了变量,这个变量就属于这个函数的作用域,而是必须使用var关键字来声明该变量,这个变量才会属于这个作用域
(2)声明函数时的函数名,其实也是一个变量名,可以通过这个变量名来给其赋值(不管是赋什么值)
(3)函数在声明出来的时候,里面的代码不会执行,只有在调用的时候代码才会执行
(4)变量搜索原则
·首选在当前链上找
·如果有,就停止查找
·如果没有,就在n-1级上查找(在函数内部允许访问定义在函数外部的变量)
·如此循环往复直到0级链
·如果找到,就结束查找,直接获得该链上变量的数据
·如果还没有就抛出异常