變量對象(Variable Object)

問題:web

  1. 聲明函數和變量發生了什麼細節?函數

  2. 解析器如何而且在什麼地方查找這些聲明的函數和變量?this

  3. 引用這些對象會發生什麼?spa

知識點:對象

變量對象(Variable Object - VO)是執行上下文的一個屬性(property、特殊對象):生命週期

  1. 存儲着在上下文中函數的形參、函數聲明(FunctionDeclaration - FD)和聲明的變量(var,變量聲明)字符串

  2. 在具體執行上下文中,VO名稱是不同的,初始結構也不同;it

  3. 全局上下文變量對象(GlobalContextVO)和函數上下文變量對象(FunctionContextVO)之分。io

---全局上下文中的變量對象function

  1. 全局對象(Global object)是在進入任何執行上下文以前就已經建立的對象,該對象只存在一份,它的屬性在程序中任何地方訪問,全局對象的生命週期終止於程序退出那一刻。

  2. 在DOM中,全局對象的window屬性引用了全局對象自身,當訪問全局對象的屬性時一般會忽略前綴,由於全局對象事不能經過名字直接訪問的(如Math,String,Date等~),不過能夠經過全局上下文的this來訪問全局對象,而在window中,變量對象就是全局對象即VO(globalContext)=== global。

---函數上下文中的變量對象

  1. 活動對象(activation object - AO)在函數執行上下文中,VO是不可能直接訪問的,此時由活動對象AO扮演VO的角色;經過函數的arguments屬性(值爲Arguments對象)初始化。

  2. Arguments對象包括:

    • callee(指向當前函數的引用);

    • length(真正傳遞的參數個數)

    • properties-indexes(字符串類型的整數)屬性的值就是函數的參數值(按參數列表從左到右排列)。properties-indexes內部元素的個數等於Arguments.length.properties-indexes的值,和實際傳遞進來的參數之間是共享的。

-------------

處理代碼分兩個階段:

  1. 未執行代碼以前,進入執行上下文建立相關意見聲明的屬性;

  2. 執行代碼

---進入執行上下文

  1. 函數的全部形參(若是此時在函數執行上下文中):按名稱和對應值的形式建立變量對象的屬性,若是沒有傳遞對應參數,則值爲undefined ;

  2. 全部函數聲明(FunctionDeclaration, FD):按名稱和對應值(函數對象function-object)的形式建立變量對象的屬性,若是已經存在相同名字的變量(變量沒賦值),代之;

  3. 全部變量聲明(var, VariableDeclaration):按名稱和對應值(undefined)的形式建立變量對象的屬性,若是已經存在相同名字(形參或者函數)的屬性,不代之 。

---代碼執行

  1. 在代碼執行前,VO/AO已經擁有了屬性,但大部分屬性仍是系統默認的初始值undefined;

  2. 代碼執行時,會相應的填充VO/AO中相應屬性的值來計算結果。

-------------

關於變量

  1. 任什麼時候候只有經過var才能聲明的變量,根據VO的相關要點,未經過var聲明的變量在執行代碼以前不會被包含到VO中;

  2. 經過var才能聲明的變量不能被delete。

---函數中,形參與變量

  • 若是函數內部聲明的變量與形參同名,但變量未賦值,則變量形參同值

  • 若是函數內部聲明的變量已經賦值了,形參沒法改變其值

  • arguments能夠獲取到形參的值。

相關文章
相關標籤/搜索