摘要:重點(diǎn)每一個(gè)函數(shù)都有自己的執(zhí)行環(huán)境,每個(gè)執(zhí)行環(huán)境都有一個(gè)與之關(guān)聯(lián)的變量對(duì)象,環(huán)境中定義的變量和函數(shù)都保存在這個(gè)對(duì)象中。即當(dāng)在函數(shù)中查找一個(gè)變量時(shí),是根據(jù)作用域查找的。此掃描的結(jié)果將稱為中的。借鑒文章譯的執(zhí)行上下文和環(huán)境棧是什么
重點(diǎn):每一個(gè)函數(shù)都有自己的執(zhí)行環(huán)境,每個(gè)執(zhí)行環(huán)境都有一個(gè)與之關(guān)聯(lián)的變量對(duì)象,環(huán)境中定義的變量和函數(shù)都保存在這個(gè)對(duì)象中。
這個(gè)對(duì)象就是執(zhí)行上下文對(duì)象:
executionContextObj={ //變量對(duì)象 variableObject:{/*函數(shù)中的arguments對(duì)象,參數(shù)、內(nèi)部的變量以及函數(shù)聲明*/] //作用域 scopeChain:{/*variableObject以及所有父執(zhí)行上下文中的variableObject*/}, this:{} }
根據(jù)這個(gè)執(zhí)行環(huán)境我們解析以下幾個(gè)問(wèn)題:
1、查找變量的順序(知識(shí)點(diǎn):作用域與作用域鏈)
executionContextObj中的scopeChain是這個(gè)函數(shù)的作用域,scopeChain=variableObject+[[scope]]
varibaleObject為當(dāng)前的變量對(duì)象,[[scope]]為父執(zhí)行上下文的作用域鏈,variableObject位于前面,所以查找變量時(shí)總是先從自身查找,然后依次到父執(zhí)行上下文中查找。
即當(dāng)在函數(shù)中查找一個(gè)變量時(shí),是根據(jù)作用域查找的。
2、this是什么?和作用域的區(qū)別
this總是指向函數(shù)調(diào)用時(shí)的環(huán)境(動(dòng)態(tài)作用域即運(yùn)行時(shí)上下文)
作用域保存的是函數(shù)被定義時(shí)的環(huán)境(靜態(tài)作用域即編程時(shí)的上下文)
我們知道javascript沒(méi)有塊級(jí)作用域,最小單位為函數(shù),作用域能訪問(wèn)到函數(shù)中的變量,this則指向調(diào)用者,即可訪問(wèn)對(duì)象中的變量
3、提升,函數(shù)提升總是優(yōu)先于變量提升(為什么可以先使用后定義)
參考:[【譯】JS的執(zhí)行上下文和環(huán)境棧是什么?]
在調(diào)用函數(shù)時(shí),但是在執(zhí)行里面的代碼之前,會(huì)對(duì)函數(shù)進(jìn)行一次掃描,解釋器通過(guò)掃描傳入的參數(shù)或參數(shù)的函數(shù)、本地函數(shù)聲明和局部函數(shù)聲明來(lái)創(chuàng)建executionContextObj。此掃描的結(jié)果將稱為executionContextObj中的variableObject。
就是因?yàn)樵诖a運(yùn)行之前,解釋器已經(jīng)掃描過(guò)在函數(shù)中變量和函數(shù),已經(jīng)創(chuàng)建這些變量,所以在代碼執(zhí)行時(shí),這些變量就可以直接使用,并且函數(shù)的提升優(yōu)先于變量。
借鑒文章:【譯】JS的執(zhí)行上下文和環(huán)境棧是什么?https://juejin.im/post/5c8554...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/109117.html
摘要:至此作用域鏈創(chuàng)建完畢。好了,通過(guò)深入理解作用域鏈,我們能跟好的理解的運(yùn)行機(jī)制和閉包的原理。 前言 理解javascript中的作用域和作用域鏈對(duì)我們理解js這們語(yǔ)言。這次想深入的聊下關(guān)于js執(zhí)行的內(nèi)部機(jī)制,主要討論下,作用域,作用域鏈,閉包的概念。為了更好的理解這些東西,我模擬了當(dāng)一個(gè)函數(shù)執(zhí)行時(shí),js引擎做了哪些事情--那些我們看不見的動(dòng)作。 關(guān)鍵詞: 執(zhí)行環(huán)境 作用域 作用域鏈 變...
摘要:引言滿滿的干貨,面試必系列,參考大量資料,并集合自己的理解以及相關(guān)的面試題,對(duì)核心知識(shí)點(diǎn)中的作用域閉包上下文進(jìn)行了梳理。如果在小區(qū)這個(gè)作用域找到了張老師,我就會(huì)在張老師的輔導(dǎo)下學(xué)鋼琴我張老師房間鋼琴構(gòu)成了學(xué)琴的上下文環(huán)境。 showImg(https://segmentfault.com/img/bVbo4hv?w=1800&h=1000); 引言 滿滿的干貨,面試必bei系列,參考大...
摘要:延長(zhǎng)作用域鏈下面兩種語(yǔ)句可以在作用域鏈的前端臨時(shí)增加一個(gè)變量對(duì)象以延長(zhǎng)作用域鏈, 問(wèn)題 今天看筆記發(fā)現(xiàn)自己之前記了一個(gè)關(guān)于同名標(biāo)識(shí)符優(yōu)先級(jí)的內(nèi)容,具體是下面這樣的: 形參優(yōu)先級(jí)高于當(dāng)前函數(shù)名,低于內(nèi)部函數(shù)名 形參優(yōu)先級(jí)高于arguments 形參優(yōu)先級(jí)高于只聲明卻未賦值的局部變量,但是低于聲明且賦值的局部變量 函數(shù)和變量都會(huì)聲明提升,函數(shù)名和變量名同名時(shí),函數(shù)名的優(yōu)先級(jí)要高。執(zhí)行代...
摘要:圖片中的作用域鏈,是全局執(zhí)行環(huán)境中的作用域鏈。然后此活動(dòng)對(duì)象被推入作用域鏈的最前端。在最后調(diào)用的時(shí)候,創(chuàng)建先構(gòu)建作用域鏈,再創(chuàng)建執(zhí)行環(huán)境,再創(chuàng)建執(zhí)行環(huán)境的時(shí)候發(fā)現(xiàn)了一個(gè)變量標(biāo)識(shí)符。 從圖書館翻過(guò)各種JS的書之后,對(duì)作用域/執(zhí)行環(huán)境/閉包這些概念有了一個(gè)比較清晰的認(rèn)識(shí)。 栗子說(shuō)明一切 第一個(gè)栗子 來(lái)看一個(gè)來(lái)自ECMA-262的栗子: var x = 10; (function foo(...
閱讀 3000·2021-10-19 11:46
閱讀 991·2021-08-03 14:03
閱讀 2952·2021-06-11 18:08
閱讀 2923·2019-08-29 13:52
閱讀 2778·2019-08-29 12:49
閱讀 496·2019-08-26 13:56
閱讀 937·2019-08-26 13:41
閱讀 861·2019-08-26 13:35