繼續上文的內容。
執行全域性**時,會產生乙個執行上下文環境,每次呼叫函式都又會產生執行上下文環境。當函式呼叫完成時,這個上下文環境以及其中的資料都會被消除,再重新回到全域性上下文環境。處於活動狀態的執行上下文環境只有乙個。
其實這是乙個壓棧出棧的過程——執行上下文棧。如下圖:
可根據以下**來詳細介紹上下文棧的壓棧、出棧過程。
如上**。
在執行**之前,首先將建立全域性上下文環境。
然後是**執行。**執行到第12行之前,上下文環境中的變數都在執行過程中被賦值。
執行到第13行,呼叫bar函式。
跳轉到bar函式內部,執行函式體語句之前,會建立乙個新的執行上下文環境。
並將這個執行上下文環境壓棧,設定為活動狀態。
執行到第5行,又呼叫了fn函式。進入fn函式,在執行函式體語句之前,會建立fn函式的執行上下文環境,並壓棧,設定為活動狀態。
待第5行執行完畢,即fn函式執行完畢後,此次呼叫fn所生成的上下文環境出棧,並且被銷毀(已經用完了,就要及時銷毀,釋放記憶體)。
同理,待第13行執行完畢,即bar函式執行完畢後,呼叫bar函式所生成的上下文環境出棧,並且被銷毀(已經用完了,就要及時銷毀,釋放記憶體)。
好了,我很耐心的給大家介紹了一段簡短**的執行上下文環境的變化過程,乙個完整的閉環。其中上下文環境的變數賦值過程我省略了許多,因為那些並不難,一看就知道。
要說閉包,咱們還得先從自由變數和作用域說起。
js執行上下文與執行上下文棧
在了解js的執行上下文物件與執行上下文棧之前,我們要先了解兩個概念 即變數提公升跟函式提公升 變數提公升 通過var定義的變數,在定義語句之前我們就可以直接訪問到,不過它的值是undefined 函式提公升 通過function定義的函式,在函式定義語句前,我們就可以直接呼叫 變數提公升與函式提公升...
JS高階(6) 執行上下文與執行上下文棧
一 變數提公升和函式提公升 變數宣告提公升 函式宣告提公升 面試題 輸出 undefined undefined 變數提公升 fn2 可呼叫 函式提公升 fn3 不能 變數提公升 二 執行上下文 分類 根據位置分 全域性執行上下文 開始執行全域性 函式執行上下文 開始執行函式體 三 執行上下文棧 在...
js高階 執行上下文棧
就是用來存全域性上下文物件和函式上下文物件的棧容器。在全域性 執行之前,js引擎就會建立乙個棧容器來儲存管理所有的執行上下文物件。在全域性執行上下文 window 確定後,將其新增到棧中 壓棧 在函式執行上下文建立後,將其新增到棧中壓棧 在當前函式執行完後,將棧頂的物件移除 出棧 當所有的 執行完後...