javascript執(zhí)行環(huán)境及作用域詳解_javascript技巧

javascript執(zhí)行環(huán)境及作用域詳解_javascript技巧

ID:30779912

大?。?39.50 KB

頁數(shù):7頁

時(shí)間:2019-01-03

javascript執(zhí)行環(huán)境及作用域詳解_javascript技巧_第1頁
javascript執(zhí)行環(huán)境及作用域詳解_javascript技巧_第2頁
javascript執(zhí)行環(huán)境及作用域詳解_javascript技巧_第3頁
javascript執(zhí)行環(huán)境及作用域詳解_javascript技巧_第4頁
javascript執(zhí)行環(huán)境及作用域詳解_javascript技巧_第5頁
資源描述:

《javascript執(zhí)行環(huán)境及作用域詳解_javascript技巧》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫

1、javascript執(zhí)行環(huán)境及作用域詳解最近在重讀《javascript高級(jí)程序設(shè)計(jì)3》,覺得應(yīng)該寫一些博客記錄一下學(xué)習(xí)的一些知識(shí),不然都忘光啦。今天??偨Y(jié)的是js執(zhí)行環(huán)境和作用域。首先來說一下執(zhí)行環(huán)境一、執(zhí)行環(huán)境書上概念,執(zhí)行環(huán)境定義了變量或者函數(shù)冇權(quán)訪問的其他數(shù)據(jù),決定了他們各口的行為。每個(gè)執(zhí)行環(huán)境都有一個(gè)與之關(guān)聯(lián)的變量對象。環(huán)境中定義的所有變量和函數(shù)都保存在這個(gè)對象屮。雖然我們在編寫代碼的吋候無法訪問這個(gè)對象,但解析器在處理數(shù)據(jù)時(shí)會(huì)在后臺(tái)用到它。執(zhí)行環(huán)境是一個(gè)概念,一種機(jī)制,它定義了變量或函數(shù)是否有權(quán)訪問其他數(shù)據(jù)在javascript

2、中,可執(zhí)行的JavaScript代碼分三種類型:1.GlobalCode,即全局的、不在任何函數(shù)里面的代碼,例如:一個(gè)js文件、嵌入在HTML頁面中的js代碼等。2.EvalCode,即使用eval()函數(shù)動(dòng)態(tài)執(zhí)行的JS代碼。3.FunctionCode,即用戶自定義函數(shù)中的函數(shù)體JS代碼。跳過EvalCode,只說全局執(zhí)行環(huán)境和函數(shù)執(zhí)行環(huán)境。1、全局環(huán)境:全局環(huán)境是最外圍的一個(gè)執(zhí)彳亍環(huán)境。全局執(zhí)彳亍環(huán)境被認(rèn)為是window對象。因此所有全局變量和函數(shù)都是作為window對象的屈性和方法創(chuàng)建的。代碼載入瀏覽器時(shí),全局執(zhí)行環(huán)境被創(chuàng)建(當(dāng)我們關(guān)

3、閉網(wǎng)頁或者瀏覽器時(shí)全局執(zhí)行環(huán)境才被銷毀)。比如在一個(gè)頁面中,第一次載入JS代碼時(shí)創(chuàng)建一個(gè)全局執(zhí)行環(huán)境。這也是為什么閉包有一個(gè)內(nèi)存泄露的缺點(diǎn)。因?yàn)殚]包屮外部函數(shù)被當(dāng)成了全局環(huán)境。所以不會(huì)被銷毀,一直保存在內(nèi)存中。2、函數(shù)執(zhí)行環(huán)境每個(gè)函數(shù)都冇自己的執(zhí)行環(huán)境,當(dāng)執(zhí)行進(jìn)入一個(gè)函數(shù)時(shí),函數(shù)的執(zhí)行環(huán)境就會(huì)被推入一個(gè)執(zhí)行環(huán)境棧的頂部并獲取執(zhí)行權(quán)。當(dāng)這個(gè)函數(shù)執(zhí)行完畢,它的執(zhí)行環(huán)境又從這個(gè)棧的頂部被刪除,并把執(zhí)行權(quán)并述給之前執(zhí)行環(huán)境。這就是ECMAScript程序中的執(zhí)行流。也可以這樣解讀:當(dāng)調(diào)用一個(gè)JavaScdpt函數(shù)時(shí),該函數(shù)就會(huì)進(jìn)入與該函數(shù)相對應(yīng)的執(zhí)

4、行環(huán)境。如果又調(diào)用了另外一個(gè)函數(shù),則又會(huì)創(chuàng)建一個(gè)新的執(zhí)行環(huán)境,并且在函數(shù)調(diào)用期間執(zhí)行過程都處于該環(huán)境中。當(dāng)調(diào)用的函數(shù)返冋后,執(zhí)行過程會(huì)返回原始執(zhí)行環(huán)境。因而,運(yùn)行屮的JavaScript代碼就構(gòu)成了一個(gè)執(zhí)行環(huán)境棧。當(dāng)函數(shù)被調(diào)用時(shí)函數(shù)的局部環(huán)境被創(chuàng)建(函數(shù)內(nèi)的代碼執(zhí)行完畢后,該環(huán)境被銷毀,同時(shí)保存在其中的所有變量和函數(shù)定義也隨之被銷毀)。2-1定義期函數(shù)定義的時(shí)候,都會(huì)創(chuàng)建一個(gè)[[scope]]屈性,通這個(gè)對象對應(yīng)的是一個(gè)對象的列表,列表屮的對象僅能javascript內(nèi)部訪問,沒法通過語法訪問。(scope也就是作用域的意思。)我們定義一全

5、局函數(shù)A,那么A函數(shù)就創(chuàng)建了一個(gè)A的[[scope]]屬性。此時(shí),[[scope]]里面只包含了全局對象[GlobalObject]o而如果,我們在A的內(nèi)部定義一個(gè)B函數(shù),那B函數(shù)同樣會(huì)創(chuàng)建一個(gè)[[scope]]屈性,B的[[scope]]屈性包含了兩個(gè)對彖,一個(gè)是A的活動(dòng)對彖ActivationObjects一個(gè)是全局對彖,A的活動(dòng)對彖在前面,全局對彖排在后面。簡而言之,一個(gè)函數(shù)的[Scope]屬性中對象列表的順序是上一層函數(shù)的ActivationObject對彖,然后是上上層的,一直到最外層的全局對彖。卜而是示例代碼:A只冇一個(gè)scop

6、e,B冇兩個(gè)scope//外部函數(shù)functionA(){varsomevar;//內(nèi)部函數(shù)functionB(){varsomevar;}2-2執(zhí)行期當(dāng)函數(shù)被執(zhí)行的吋候,就是進(jìn)入這個(gè)函數(shù)的執(zhí)行環(huán)境,首先會(huì)創(chuàng)一個(gè)它自己的活動(dòng)對象[ActivationObject](這個(gè)對象中包含了this、參數(shù)(arguments)>局部變量(包括命名的參數(shù))的定義和一個(gè)變量對象的作用域鏈[[scopechain]],然后,把這個(gè)執(zhí)行環(huán)境的[scope]按順序復(fù)制到[[scopechain]]里,最后把這個(gè)活動(dòng)對彖推入到[[scopechain]]的頂部。

7、這樣[[scopechain]]就是一個(gè)有序的棧,這樣保了對執(zhí)行環(huán)境有權(quán)訪問的所有變量和對象的有序訪問。//笫一步頁面載入創(chuàng)全局執(zhí)彳亍環(huán)境globalexecutingcontext和全局活動(dòng)彖//定義全局[[scope]],只含有Window對象//掃描全局的定義變量及函數(shù)對象:color[undefined]>changecolor[FD創(chuàng)建changecolor的[[scope]],此時(shí)里面只含有全局活動(dòng)對象】,加入到window中,所以全局變量和全局函數(shù)對象都是做為window的屈性定義的。//程序已經(jīng)定義好所以在此執(zhí)行環(huán)境內(nèi)任何位

8、置都可以執(zhí)行changecolor(),color也已經(jīng)被定義,但是它的值是undefined//第二步color賦值"blue"varcolor="blue";//它是不需要賦

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時(shí)聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請聯(lián)系客服處理。