問題:web
聲明函數和變量發生了什麼細節?函數
解析器如何而且在什麼地方查找這些聲明的函數和變量?this
引用這些對象會發生什麼?spa
知識點:對象
變量對象(Variable Object - VO)是執行上下文的一個屬性(property、特殊對象):生命週期
存儲着在上下文中函數的形參、函數聲明(FunctionDeclaration - FD)和聲明的變量(var,變量聲明);字符串
在具體執行上下文中,VO名稱是不同的,初始結構也不同;it
有全局上下文變量對象(GlobalContextVO)和函數上下文變量對象(FunctionContextVO)之分。io
---全局上下文中的變量對象function
全局對象(Global object)是在進入任何執行上下文以前就已經建立的對象,該對象只存在一份,它的屬性在程序中任何地方訪問,全局對象的生命週期終止於程序退出那一刻。
在DOM中,全局對象的window屬性引用了全局對象自身,當訪問全局對象的屬性時一般會忽略前綴,由於全局對象事不能經過名字直接訪問的(如Math,String,Date等~),不過能夠經過全局上下文的this來訪問全局對象,而在window中,變量對象就是全局對象即VO(globalContext)=== global。
---函數上下文中的變量對象
活動對象(activation object - AO)在函數執行上下文中,VO是不可能直接訪問的,此時由活動對象AO扮演VO的角色;經過函數的arguments屬性(值爲Arguments對象)初始化。
Arguments對象包括:
callee(指向當前函數的引用);
length(真正傳遞的參數個數);
properties-indexes(字符串類型的整數)屬性的值就是函數的參數值(按參數列表從左到右排列)。properties-indexes內部元素的個數等於Arguments.length.properties-indexes的值,和實際傳遞進來的參數之間是共享的。
-------------
處理代碼分兩個階段:
未執行代碼以前,進入執行上下文建立相關意見聲明的屬性;
執行代碼。
---進入執行上下文
函數的全部形參(若是此時在函數執行上下文中):按名稱和對應值的形式建立變量對象的屬性,若是沒有傳遞對應參數,則值爲undefined ;
全部函數聲明(FunctionDeclaration, FD):按名稱和對應值(函數對象function-object)的形式建立變量對象的屬性,若是已經存在相同名字的變量(變量沒賦值),代之;
全部變量聲明(var, VariableDeclaration):按名稱和對應值(undefined)的形式建立變量對象的屬性,若是已經存在相同名字(形參或者函數)的屬性,不代之 。
---代碼執行
在代碼執行前,VO/AO已經擁有了屬性,但大部分屬性仍是系統默認的初始值undefined;
代碼執行時,會相應的填充VO/AO中相應屬性的值來計算結果。
-------------
關於變量
任什麼時候候只有經過var才能聲明的變量,根據VO的相關要點,未經過var聲明的變量在執行代碼以前不會被包含到VO中;
經過var才能聲明的變量不能被delete。
---函數中,形參與變量
若是函數內部聲明的變量與形參同名,但變量未賦值,則變量形參同值;
若是函數內部聲明的變量已經賦值了,形參沒法改變其值;
arguments能夠獲取到形參的值。