深入理解javascript原型和閉包(9)——簡述【執(zhí)行上下文】下
繼續(xù)上一篇文章(http://www.rzrgm.cn/wangfupeng1988/p/3986420.html)的內(nèi)容。
上一篇我們講到在全局環(huán)境下的代碼段中,執(zhí)行上下文環(huán)境中有如何數(shù)據(jù):
- 變量、函數(shù)表達式——變量聲明,默認賦值為undefined;
- this——賦值;
- 函數(shù)聲明——賦值;
如果在函數(shù)中,除了以上數(shù)據(jù)之外,還會有其他數(shù)據(jù)。先看以下代碼:

以上代碼展示了在函數(shù)體的語句執(zhí)行之前,arguments變量和函數(shù)的參數(shù)都已經(jīng)被賦值。從這里可以看出,函數(shù)每被調(diào)用一次,都會產(chǎn)生一個新的執(zhí)行上下文環(huán)境。因為不同的調(diào)用可能就會有不同的參數(shù)。
另外一點不同在于,函數(shù)在定義的時候(不是調(diào)用的時候),就已經(jīng)確定了函數(shù)體內(nèi)部自由變量的作用域。至于“自由變量”和“作用域”是后面要專門拿出來講述的重點,這里就先點到為止。用一個例子說明一下:

好了,總結完了函數(shù)的附加內(nèi)容,我們就此要全面總結一下上下文環(huán)境的數(shù)據(jù)內(nèi)容。
全局代碼的上下文環(huán)境數(shù)據(jù)內(nèi)容為:
|
普通變量(包括函數(shù)表達式), 如: var a = 10; |
聲明(默認賦值為undefined) |
|
函數(shù)聲明, 如: function fn() { } |
賦值 |
|
this |
賦值 |
如果代碼段是函數(shù)體,那么在此基礎上需要附加:
|
參數(shù) |
賦值 |
|
arguments |
賦值 |
|
自由變量的取值作用域 |
賦值 |
給執(zhí)行上下文環(huán)境下一個通俗的定義——在執(zhí)行代碼之前,把將要用到的所有的變量都事先拿出來,有的直接賦值了,有的先用undefined占個空。
了解了執(zhí)行上下文環(huán)境中的數(shù)據(jù)信息,你就不用再去死記硬背那些可惡的面試題了。理解了就不用背誦!
講完了上下文環(huán)境,又來了新的問題——在執(zhí)行js代碼時,會有數(shù)不清的函數(shù)調(diào)用次數(shù),會產(chǎn)生許多個上下文環(huán)境。這么多上下文環(huán)境該如何管理,以及如何銷毀而釋放內(nèi)存呢?下一節(jié)將通過“執(zhí)行上下文棧”來解釋這個問題。
不過別著急,在解釋“執(zhí)行上下文棧”之前,還需要把this說一下,this還是挺重要的。
說完this,接著說執(zhí)行上下文棧。
---------------------------------------------------------------------------
本文已更新到《深入理解javascript原型和閉包系列》的目錄,更多內(nèi)容可參見《深入理解javascript原型和閉包系列》。
另外,歡迎關注我的微博。
學習作者教程:《前端JS高級面試》《前端JS基礎面試題》《React.js模擬大眾點評webapp》《zepto設計與源碼分析》《json2.js源碼解讀》

浙公網(wǎng)安備 33010602011771號