繼續(xù)上一篇文章(http://www.cnblogs.com/wangfupeng1988/p/3986420.html)的內(nèi)容。
上一篇我們講到在全局環(huán)境下的代碼段中,執(zhí)行上下文環(huán)境中有如何數(shù)據(jù):
如果在函數(shù)中,除了以上數(shù)據(jù)之外,還會有其他數(shù)據(jù)。先看以下代碼:
以上代碼展示了在函數(shù)體的語句執(zhí)行之前,arguments變量和函數(shù)的參數(shù)都已經(jīng)被賦值。從這里可以看出,函數(shù)每被調(diào)用一次,都會產(chǎn)生一個新的執(zhí)行上下文環(huán)境。因?yàn)椴煌恼{(diào)用可能就會有不同的參數(shù)。
另外一點(diǎn)不同在于,函數(shù)在定義的時候(不是調(diào)用的時候),就已經(jīng)確定了函數(shù)體內(nèi)部自由變量的作用域。至于“自由變量”和“作用域”是后面要專門拿出來講述的重點(diǎn),這里就先點(diǎn)到為止。用一個例子說明一下:
好了,總結(jié)完了函數(shù)的附加內(nèi)容,我們就此要全面總結(jié)一下上下文環(huán)境的數(shù)據(jù)內(nèi)容。
全局代碼的上下文環(huán)境數(shù)據(jù)內(nèi)容為:
普通變量(包括函數(shù)表達(dá)式),如: var a = 10; | 聲明(默認(rèn)賦值為undefined) |
函數(shù)聲明,如: function fn() { } | 賦值 |
this | 賦值 |
如果代碼段是函數(shù)體,那么在此基礎(chǔ)上需要附加: | |
---|---|
參數(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í)行上下文棧。
更多建議: