小編給大家分享一下JavaScript執(zhí)行上下文的處理過(guò)程,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),黑龍江企業(yè)網(wǎng)站建設(shè),黑龍江品牌網(wǎng)站建設(shè),網(wǎng)站定制,黑龍江網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,黑龍江網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。在《深入學(xué)習(xí)js之——執(zhí)行上下文?!分姓f(shuō)過(guò),當(dāng)JavaScript代碼執(zhí)行一段可執(zhí)行代碼(executable code)時(shí),會(huì)創(chuàng)建對(duì)應(yīng)的執(zhí)行上下文(execution context)
對(duì)于每一個(gè)執(zhí)行上下文,都有三個(gè)重要的屬性:
變量對(duì)象(Variable object VO)
作用域鏈(Scope chain)
this
本文我們結(jié)合著這三個(gè)部分的內(nèi)容,講講執(zhí)行上下文的具體處理過(guò)程。
在《深入學(xué)習(xí)js之——詞法作用域和動(dòng)態(tài)作用域》中,提出這樣一道思考題:
// 思考題一: var scope = "global scope"; function checkscope(){ var scope = "local scope"; function f(){ return scope; } return f(); } checkscope(); // 思考題二: var scope = "global scope"; function checkscope(){ var scope = "local scope"; function f(){ return scope; } return f; } checkscope()();
兩段代碼都會(huì)打印local scope
,但是還是有些許差異的,本文就詳細(xì)的解析執(zhí)行上下文棧和執(zhí)行上下文的具體變化過(guò)程。
我們分析第一段代碼:
var scope = "global scope"; function checkscope(){ var scope = "local scope"; function f(){ return scope; } return f(); } checkscope();
執(zhí)行過(guò)程如下:
1、執(zhí)行全局代碼,創(chuàng)建全局執(zhí)行上下文,全局上下文被壓入執(zhí)行上下文棧
ECStack = [ globalContext ];
2、全局上下文初始化
globalContext = { VO: [global], Scope: [globalContext.VO], this: globalContext.VO }
2、初始化的同時(shí),checkscope 函數(shù)被創(chuàng)建,保存作用域鏈到函數(shù)內(nèi)部的屬性[[scope]]
checkscope.[[scope]] = [ globalContext.VO ];
3、執(zhí)行checkScope 函數(shù),創(chuàng)建checkScope 函數(shù)執(zhí)行上下文,checkScope 函數(shù)執(zhí)行上下文被壓入執(zhí)行上下文棧:
ECStack = [ checkscopeContext, globalContext ];
4、checkscope 函數(shù)執(zhí)行上下文初始化:
1.復(fù)制函數(shù) [[scope]] 屬性創(chuàng)建作用域鏈,
2.用 arguments 創(chuàng)建活動(dòng)對(duì)象,
3.初始化活動(dòng)對(duì)象,即加入形參、函數(shù)聲明、變量聲明,
4.將活動(dòng)對(duì)象壓入 checkscope 作用域鏈頂端,
同時(shí) f 函數(shù)被創(chuàng)建,保存作用域鏈到 f 函數(shù)的內(nèi)部屬性[[scope]]
checkscopeContext = { AO: { arguments: { length: 0 }, scope: undefined, f: reference to function f(){} }, Scope: [AO, globalContext.VO], this: undefined }
5、執(zhí)行f函數(shù),創(chuàng)建 f 函數(shù)執(zhí)行上下文,f 函數(shù)執(zhí)行上下文被壓入執(zhí)行上下文棧
ECStack = [ fContext, checkscopeContext, globalContext ]
6、f 函數(shù)執(zhí)行上下文初始化, 以下跟第 4 步相同:
1.復(fù)制函數(shù)[[scope]]
屬性創(chuàng)建作用域鏈
2.用 arguments 創(chuàng)建活動(dòng)對(duì)象
3.初始化活動(dòng)對(duì)象,即加入形參、函數(shù)聲明、變量聲明
4.將活動(dòng)對(duì)象壓入 f 作用域鏈頂端
fContext = { AO: { arguments: { length: 0 } }, Scope: [AO, checkscopeContext.AO, globalContext.VO], this: undefined }
7、f 函數(shù)執(zhí)行,沿著作用域鏈查找 scope 值,返回 scope 值
8、f 函數(shù)執(zhí)行完畢,f 函數(shù)上下文從執(zhí)行上下文棧中彈出
ECStack = [ checkscopeContext, globalContext ]
9、checkscope 函數(shù)執(zhí)行完畢,checkscope 執(zhí)行上下文從執(zhí)行上下文棧中彈出
ECStack = [ globalContext ]
以上是“JavaScript執(zhí)行上下文的處理過(guò)程”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。