執行上下文的**被分成兩個基本的階段來處理:
進入執行上下文
執行**
變數物件的修改變化與這兩個階段緊密相關。
注:這2個階段的處理是一般行為,和上下文的型別無關(也就是說,在全域性上下文和函式上下文中的表現是一樣的)。
進入執行上下文
當進入執行上下文(**執行之前)時,vo裡已經包含了下列屬性(前面已經說了):
讓我們看乙個例子:
functiontest(a, b)
var e = function
_e() {};
(function
x() {});}
test(10); //
call
當進入帶有引數10的test函式上下文時,ao表現為如下:
ao(test) =;
注意,ao裡並不包含函式「x」。這是因為「x」 是乙個函式表示式(functionexpression, 縮寫為 fe) 而不是函式宣告,函式表示式不會影響vo。 不管怎樣,函式「_e」 同樣也是函式表示式,但是就像我們下面將看到的那樣,因為它分配給了變數 「e」,所以它可以通過名稱「e」來訪問。 函式宣告functiondeclaration與函式表示式functionexpression 的不同,可以參考前面的專題文章。
這之後,將進入處理上下文**的第二個階段 — 執行**。
**執行
這個週期內,ao/vo已經擁有了屬性(不過,並不是所有的屬性都有值,大部分屬性的值還是系統預設的初始值undefined )。還是前面那個例子,ao/vo在**解釋期間被修改如下:
ao['c'] = 10;ao['e'] = ;
再次注意,因為functionexpression「_e」儲存到了已宣告的變數「e」上,所以它仍然存在於記憶體中。而functionexpression 「x」卻不存在於ao/vo中,也就是說如果我們想嘗試呼叫「x」函式,不管在函式定義之前還是之後,都會出現乙個錯誤「x is not defined」,未儲存的函式表示式只有在它自己的定義或遞迴中才能被呼叫。
另乙個經典例子:
alert(x); //function
var x = 10;
alert(x);
//10
x = 20;
function
x() {};
alert(x);
//20
為什麼第乙個alert 「x」 的返回值是function,而且它還是在「x」 宣告之前訪問的「x」 的?為什麼不是10或20呢?因為,根據規範函式宣告是在當進入上下文時填入的; 同意週期,在進入上下文的時候還有乙個變數宣告「x」,那麼正如我們在上乙個階段所說,變數宣告在順序上跟在函式宣告和形式引數宣告之後,而且在這個進入上下文階段,變數宣告不會干擾vo中已經存在的同名函式宣告或形式引數宣告,因此,在進入上下文時,vo的結構如下:
vo ={};vo['x'] = //
找到var x = 10;
//如果function "x"沒有已經宣告的話
//這時候"x"的值應該是undefined
//但是這個case裡變數宣告沒有影響同名的function的值
vo['x'] = function>
緊接著,在執行**階段,vo做如下修改:
vo['x'] = 10;vo['x'] = 20;
我們可以在第
二、三個alert看到這個效果。
在下面的例子裡我們可以再次看到,變數是在進入上下文階段放入vo中的。(因為,雖然else部分**永遠不會執行,但是不管怎樣,變數「b」仍然存在於vo中。)
if (true) else
alert(a); //1
alert(b); //
undefined,不是b沒有宣告,而是b的值是undefined
上下文 上下文棧
全域性 函式 區域性 在執行全域性 前將window確定為全域性執行上下文 對全域性資料進行預處理 var定義的全域性變數 undefined,新增為window的屬性 function宣告的全域性函式 賦值 fun 新增為window的方法 this 賦值 window 開始執行全域性 在呼叫函式...
中斷上下文 程序上下文
在學習與作業系統相關的知識時候,我們經常遇到程序上下文 中斷上下文,看似熟悉又感覺不是特別清晰。這裡我們從如下幾個方面進行描述。上下文是從英文中context翻譯過來的,指的是一種環境。上下文我們看起來不怎麼熟悉,但是我們可以看context的中文翻譯,或者我們能更加的情形些。context n 語...
全域性上下文與上下文
全域性上下文由main函式載入系統的主架構和主事件迴圈和全域性資料構成。是上帝創造世界時,建立的基礎事物。萬物之始,大道至簡,衍化至繁。全域性上下文代表著程式執行所需要的基礎資源。是程式執行的基礎。全域性上下文的特徵是在程式執行期間常駐記憶體。全域性上下文的生命週期和應用程式的生命週期相同。與應用程...