作用域链
视频锁定
{$ currentTime | date:'mm:ss' $}
{$ timeLeft | date:'mm:ss' $}
作用域链与原型链类似,也是一个对象组成的链,用以在上下文中查找标识符(变量, 函数等)。查找时也与原型链类似,如果激活对象本身具有该变量,则直接使用变量的值, 否则向上层搜索,一次类推,知道查找到或者返回 undefined。作用域链的主要作用是用 以查找自由变量,所谓自由变量是指,在函数中使用的,非函数内部局部变量,也非函数内部定义的函数名,也非形式参数的变量。这些变量通常来自于函数的“外层”或者全局作用域,比如,我们在函数内部使用的 window 对象及其属性。
关于作用域链及自由变量,我们可以来看下面一个例子:
var topone = "top-level";
(function outter(){
var middle = "mid-level";
(function inner(){
var bottom = "bot-level";
print(topone+">"+middle+">"+bottom);
})();
})();
在函数 inner 之中,print 语句中出现的 topone, middle 变量就是自由变量。
图 上例中的作用域链
根据上图我们可以看出,内部函数的作用域链,由两部分:内部函数自身的活动对象,内部函数的一个属性”[[scope]]”,而”[[scope]]”的值为其外部函数 outter 的活动对象,其更外部的全局 global 对象的变量对象。这样,如果在 inner 中要使用外部的自由变量,显 然可以很方便的沿着作用域链上溯。
事实上,函数的属性”[[scope]]”会在函数对象创建的时候被创建,这个特性在下一小节中讨论,而不论函数的嵌套层次有多深,它的”[[scope]]”总会引用所有的位于其外层的上下文中的变量对象(在函数中,为活动对象)。
在线练习
{$ activeFileHint $}