深入理解javascript原型和閉包(13)-【作用域】和【上下文環境】

王福朋發表於2014-09-25

上文簡單介紹了作用域,本文把作用域和上下文環境結合起來說一下,會理解的更深一些。

如上圖,我們在上文中已經介紹了,除了全域性作用域之外,每個函式都會建立自己的作用域,作用域在函式定義時就已經確定了。而不是在函式呼叫時確定

下面我們將按照程式執行的順序,一步一步把各個上下文環境加上。另外,對上下文環境不瞭解的朋友,可以去看看之前的兩篇文章:

http://www.cnblogs.com/wangfupeng1988/p/3986420.html

http://www.cnblogs.com/wangfupeng1988/p/3987563.html

 

第一步,在載入程式時,已經確定了全域性上下文環境,並隨著程式的執行而對變數就行賦值。

 

第二步,程式執行到第27行,呼叫fn(10),此時生成此次呼叫fn函式時的上下文環境,壓棧,並將此上下文環境設定為活動狀態。

 

第三步,執行到第23行時,呼叫bar(100),生成此次呼叫的上下文環境,壓棧,並設定為活動狀態。

 

第四步,執行完第23行,bar(100)呼叫完成。則bar(100)上下文環境被銷燬。接著執行第24行,呼叫bar(200),則又生成bar(200)的上下文環境,壓棧,設定為活動狀態。

 

第五步,執行完第24行,則bar(200)呼叫結束,其上下文環境被銷燬。此時會回到fn(10)上下文環境,變為活動狀態。

 

第六步,執行完第27行程式碼,fn(10)執行完成之後,fn(10)上下文環境被銷燬,全域性上下文環境又回到活動狀態。

 

結束了。像老太太的裹腳布——又臭又長!

 

最後我們可以把以上這幾個圖片連線起來看看。

連線起來看,還是挺有意思的。作用域只是一個“地盤”,一個抽象的概念,其中沒有變數。要通過作用域對應的執行上下文環境來獲取變數的值。同一個作用域下,不同的呼叫會產生不同的執行上下文環境,繼而產生不同的變數的值。所以,作用域中變數的值是在執行過程中產生的確定的,而作用域卻是在函式建立時就確定了

所以,如果要查詢一個作用域下某個變數的值,就需要找到這個作用域對應的執行上下文環境,再在其中尋找變數的值

 

雖然本文很長,但是文字較少,圖片居多,圖片都有形象的展示,大家花十幾分鍾也能慢慢看完。但是,這節內容真的很重要。

以上程式碼中,我們們還沒有設計到跨作用域取值的情況,即——自由變數。詳細內容且聽下回分解。

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

本文已更新到《深入理解javascript原型和閉包系列》的目錄,更多內容可參見《深入理解javascript原型和閉包系列》。

另外,歡迎關注我的微博

學習作者教程:《前端JS高階面試》《前端JS基礎面試題》《React.js模擬大眾點評webapp》《zepto設計與原始碼分析》《json2.js原始碼解讀

相關文章