javascript變量對象

原文地址https://github.com/mqyqingfeng/Blog

函數上下文

在函數上下文中,我們用活動對象(activation object, AO)來表示變量對象。
活動對象和變量對象其實是一個東西,只是變量對象是規範上的或者說是引擎實現上的,不可在 JavaScript 環境中訪問,只有到當進入一個執行上下文中,這個執行上下文的變量對象纔會被激活,所以才叫 activation object 吶,而只有被激活的變量對象,也就是活動對象上的各種屬性才能被訪問。
活動對象是在進入函數上下文時刻被創建的,它通過函數的 arguments 屬性初始化。arguments 屬性值是 Arguments 對象。
執行過程
執行上下文的代碼會分成兩個階段進行處理:分析和執行,我們也可以叫做:
進入執行上下文
代碼執行
進入執行上下文
當進入執行上下文時,這時候還沒有執行代碼,
變量對象會包括:


函數的所有形參 (如果是函數上下文)
由名稱和對應值組成的一個變量對象的屬性被創建
沒有實參,屬性值設爲 undefined


函數聲明
由名稱和對應值(函數對象(function-object))組成一個變量對象的屬性被創建
如果變量對象已經存在相同名稱的屬性,則完全替換這個屬性


變量聲明
由名稱和對應值(undefined)組成一個變量對象的屬性被創建;
如果變量名稱跟已經聲明的形式參數或函數相同,則變量聲明不會干擾已經存在的這類屬性
舉個例子:
function foo(a) {
 
  var b = 2;
 
  function c() {}
 
  var d = function() {};


  b = 3;

}
}

foo(1);
在進入執行上下文後,這時候的 AO 是:
AO = {
 
    arguments: {
 
        0: 1,
 
        length: 1
    },
 
    a: 1,
 
    b: undefined,
 
    c: reference to function c(){},
 
    d: undefined
}
}
代碼執行
在代碼執行階段,會順序執行代碼,根據代碼,修改變量對象的值
還是上面的例子,當代碼執行完後,這時候的 AO 是:
AO = {
 
    arguments: {
 
        0: 1,
 
        length: 1
    },
 
    a: 1,
 
    b: 3,
 
    c: reference to function c(){},
 
    d: reference to FunctionExpression "d"
}
}
到這裏變量對象的創建過程就介紹完了,讓我們簡潔的總結我們上述所說:


全局上下文的變量對象初始化是全局對象


函數上下文的變量對象初始化只包括 Arguments 對象


在進入執行上下文時會給變量對象添加形參、函數聲明、變量聲明等初始的屬性值


在代碼執行階段,會再次修改變量對象的屬性值
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章