作用链
在JavaScript中,函数可以製造一个作用域(函数作用域),如果函数中还有函数那么这个作用域中又会建立一个作用域,将所有的作用域列出来可以获得一个结构,一个函数内指向函数外的链式结构。
而作用链相当于一个物件的链表,如果要找一个变数X,会从这个作用链当前有权限访问的最底层物件开是找,如果这个最底层的物件有X这个变数就直接使用,若没有则会向上层寻找有没有这个变数一直找到作用链的顶部(全域),如果都没有则返回undefined
//全域作用域function f1(){ //一级函式作用域 function f2(){ //二级函式作用域 }}//全域作用域var num = 456;//全域作用域function f3(){ //一级函式作用域 function f4(){ //二级函式作用域 }}
绘製作用链
将全域看成一条线,记为0级链。看全域中有什么成员被宣告(变数、function),若有则以方格形式放在0级链上。看看0级链上的function中是否还有function,若有则0级链上的function中拉出新的链代表1级链。在每一个1级链中重複上面行为,以此类推。找寻变数的规则
先看需要找的变数目前在第几级链上,看该级别链上是否有指定的变数,若有则可以直接使用。若本级别链上没有找到则往上层找(n-1级链),若有直接使用,没有则再往上层找。若一直往上找值到0级链(全域)都没有该变数则返回undefined。function f1() { var num = 123; function f2() { console.log(num); } f2();}var num = 456;f1(); //123
2级链
,一开始会在同级(2级链)中寻找有没有num这个变数,发现没有后便往上层(1级链)寻找。到1级链中发现有num这个变数则直接使用,于是console出123。练习
透过上面的介绍,多多少少也了解了作用域与作用域链,在网上找一些题目尝试绘製作用域链图并解答Console的答案。
var num = 123;function f1() { console.log( num ); }function f2() { var num = 456; f1();}f2(); //123
参考资料 :
JavaScript高级讲义