(13)-【作用域】和【上下文環(huán)境】

2018-02-24 15:44 更新

上文簡(jiǎn)單介紹了作用域,本文把作用域和上下文環(huán)境結(jié)合起來(lái)說(shuō)一下,會(huì)理解的更深一些。

如上圖,我們?cè)谏衔闹幸呀?jīng)介紹了,除了全局作用域之外,每個(gè)函數(shù)都會(huì)創(chuàng)建自己的作用域,作用域在函數(shù)定義時(shí)就已經(jīng)確定了。而不是在函數(shù)調(diào)用時(shí)確定。

下面我們將按照程序執(zhí)行的順序,一步一步把各個(gè)上下文環(huán)境加上。另外,對(duì)上下文環(huán)境不了解的朋友,可以去看看之前的兩篇文章:

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

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

第一步,在加載程序時(shí),已經(jīng)確定了全局上下文環(huán)境,并隨著程序的執(zhí)行而對(duì)變量就行賦值。

第二步,程序執(zhí)行到第27行,調(diào)用fn(10),此時(shí)生成此次調(diào)用fn函數(shù)時(shí)的上下文環(huán)境,壓棧,并將此上下文環(huán)境設(shè)置為活動(dòng)狀態(tài)。

第三步,執(zhí)行到第23行時(shí),調(diào)用bar(100),生成此次調(diào)用的上下文環(huán)境,壓棧,并設(shè)置為活動(dòng)狀態(tài)。

第四步,執(zhí)行完第23行,bar(100)調(diào)用完成。則bar(100)上下文環(huán)境被銷(xiāo)毀。接著執(zhí)行第24行,調(diào)用bar(200),則又生成bar(200)的上下文環(huán)境,壓棧,設(shè)置為活動(dòng)狀態(tài)。

第五步,執(zhí)行完第24行,則bar(200)調(diào)用結(jié)束,其上下文環(huán)境被銷(xiāo)毀。此時(shí)會(huì)回到fn(10)上下文環(huán)境,變?yōu)榛顒?dòng)狀態(tài)。

第六步,執(zhí)行完第27行代碼,fn(10)執(zhí)行完成之后,fn(10)上下文環(huán)境被銷(xiāo)毀,全局上下文環(huán)境又回到活動(dòng)狀態(tài)。

結(jié)束了。像老太太的裹腳布——又臭又長(zhǎng)!

最后我們可以把以上這幾個(gè)圖片連接起來(lái)看看。

連接起來(lái)看,還是挺有意思的。作用域只是一個(gè)“地盤(pán)”,一個(gè)抽象的概念,其中沒(méi)有變量。要通過(guò)作用域?qū)?yīng)的執(zhí)行上下文環(huán)境來(lái)獲取變量的值。同一個(gè)作用域下,不同的調(diào)用會(huì)產(chǎn)生不同的執(zhí)行上下文環(huán)境,繼而產(chǎn)生不同的變量的值。所以,作用域中變量的值是在執(zhí)行過(guò)程中產(chǎn)生的確定的,而作用域卻是在函數(shù)創(chuàng)建時(shí)就確定了。

所以,如果要查找一個(gè)作用域下某個(gè)變量的值,就需要找到這個(gè)作用域?qū)?yīng)的執(zhí)行上下文環(huán)境,再在其中尋找變量的值。

雖然本文很長(zhǎng),但是文字較少,圖片居多,圖片都有形象的展示,大家花十幾分鐘也能慢慢看完。但是,這節(jié)內(nèi)容真的很重要。

以上代碼中,咱們還沒(méi)有設(shè)計(jì)到跨作用域取值的情況,即——自由變量。詳細(xì)內(nèi)容且聽(tīng)下回分解。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)