摘要:當(dāng)執(zhí)行流進(jìn)入一個(gè)函數(shù)時(shí),函數(shù)的環(huán)境就會(huì)被推入一個(gè)環(huán)境棧中。在函數(shù)執(zhí)行完后,棧將其環(huán)境彈出,把控制權(quán)返回給之前的執(zhí)行環(huán)境。執(zhí)行環(huán)境可以分為創(chuàng)建執(zhí)行銷毀三個(gè)階段。在這個(gè)階段,作用域鏈會(huì)被初始化,的值也會(huì)被最終確定。
執(zhí)行環(huán)境
執(zhí)行環(huán)境中定義了變量和函數(shù)有權(quán)訪問的其他數(shù)據(jù),決定了他們各自的行為。
當(dāng)JavaScript解釋器初始化執(zhí)行代碼時(shí),它首先默認(rèn)進(jìn)入全局執(zhí)行環(huán)境,從此刻開始,函數(shù)的每次調(diào)用都會(huì)創(chuàng)建一個(gè)新的執(zhí)行環(huán)境。
每個(gè)函數(shù)都有自己的執(zhí)行環(huán)境。當(dāng)執(zhí)行流進(jìn)入一個(gè)函數(shù)時(shí),函數(shù)的環(huán)境就會(huì)被推入一個(gè)環(huán)境棧中(execution stack)。在函數(shù)執(zhí)行完后,棧將其環(huán)境彈出,把控制權(quán)返回給之前的執(zhí)行環(huán)境。ECMAScript程序中的執(zhí)行流正是由這個(gè)便利的機(jī)制控制著。
執(zhí)行環(huán)境可以分為創(chuàng)建、執(zhí)行、銷毀三個(gè)階段。在創(chuàng)建階段,解析器首先會(huì)創(chuàng)建一個(gè)變量對(duì)象(variable object),它由定義在執(zhí)行環(huán)境中的變量、函數(shù)聲明、和參數(shù)組成。在這個(gè)階段,作用域鏈會(huì)被初始化,this的值也會(huì)被最終確定。在執(zhí)行階段,代碼被解釋執(zhí)行。 某個(gè)執(zhí)行環(huán)境中的所有代碼執(zhí)行完畢后,該環(huán)境被銷毀,保存在其中的所有變量和函數(shù)定義也隨之銷毀
作用域鏈當(dāng)代碼在一個(gè)執(zhí)行環(huán)境中執(zhí)行時(shí),會(huì)創(chuàng)建變量對(duì)象的一個(gè)作用域鏈
作用域鏈的作用是:保證對(duì) 當(dāng)前執(zhí)行環(huán)境權(quán)訪問的所有變量和函數(shù)的有序訪問
作用域的前端始終是當(dāng)前執(zhí)行的代碼所在環(huán)境的變量對(duì)象
作用域鏈的最后始終是全局執(zhí)行環(huán)境的變量對(duì)象
作用域鏈里只包含上一級(jí)的變量對(duì)象,但并不包括下一級(jí)的變量對(duì)象
標(biāo)識(shí)符解析的是沿著作用域鏈一級(jí)一級(jí)地搜索標(biāo)識(shí)符的過程,搜索始終從作用域鏈的前端開始(當(dāng)前環(huán)境的變量對(duì)象),逐級(jí)向后查找(上級(jí)環(huán)境的變量對(duì)象),直至找到標(biāo)識(shí)符為止
內(nèi)部環(huán)境可以通過作用域鏈訪問所有外部環(huán)境,但是外部環(huán)境無法訪問內(nèi)部環(huán)境中的任何變量和函數(shù)
延長(zhǎng)作用域鏈:
在作用域鏈的前端(自己的變量對(duì)象之前)臨時(shí)增加一個(gè)變量對(duì)象,該變量對(duì)象會(huì)在(這段)代碼執(zhí)行后被移除
try-catch語句中的catch塊
with語句:
function builder(){ var str = "advd" // 在作用域鏈的前端臨時(shí)增加了一個(gè)變量對(duì)象,這樣在當(dāng)前執(zhí)行環(huán)境中就可以訪問loaction的屬性和方法了 with(location){ var url = href + str } // 當(dāng)with代碼執(zhí)行后,作用域鏈中的臨時(shí)變量對(duì)象被移除,此時(shí)無法訪問href console.log(href) // Uncaught ReferenceError: href is not defined return url }作用域
我認(rèn)為作用域鏈?zhǔn)菍?duì)變量對(duì)象/執(zhí)行環(huán)境而言的,當(dāng)執(zhí)行環(huán)境中出現(xiàn)一個(gè)變量時(shí),應(yīng)該按照怎樣的搜索方式(沿著作用域鏈)去找到這個(gè)變量
作用域是對(duì)于變量而言的,指明了這個(gè)變量在哪些地方可以被訪問到,例如某一變量處于全局作用域中,則該變量可以在代碼的任何地方被訪問到
全局作用域:
最外層函數(shù)和最外層函數(shù)外面定義的變量擁有全局作用域
所有 未定義 (要理解這個(gè)未定義的含義) 直接賦值的變量自動(dòng)聲明為擁有全局作用域
window對(duì)象的屬性擁有全局作用域
函數(shù)作用域:
在函數(shù)中定義的變量
給函數(shù)傳遞的參數(shù)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/83164.html
摘要:所以,全局執(zhí)行環(huán)境的變量對(duì)象始終都是作用域鏈中的最后一個(gè)對(duì)象。講到這里,可能你已經(jīng)對(duì)執(zhí)行環(huán)境執(zhí)行環(huán)境對(duì)象變量對(duì)象作用域作用域鏈的理解已經(jīng)他們之間的關(guān)系有了一個(gè)較清晰的認(rèn)識(shí)。 JavaScript中的執(zhí)行環(huán)境、作用域、作用域鏈、閉包一直是一個(gè)非常有意思的話題,很多博主和大神都分享過相關(guān)的文章。這些知識(shí)點(diǎn)不僅比較抽象,不易理解,更重要的是與這些知識(shí)點(diǎn)相關(guān)的問題在面試中高頻出現(xiàn)。之前我也看過...
摘要:全局執(zhí)行環(huán)境的變量對(duì)象始終是作用域鏈中的最后一個(gè)變量對(duì)象。綜上,每個(gè)函數(shù)對(duì)應(yīng)一個(gè)執(zhí)行環(huán)境,每個(gè)執(zhí)行環(huán)境對(duì)應(yīng)一個(gè)變量對(duì)象,而多個(gè)變量對(duì)象構(gòu)成了作用域鏈,如果當(dāng)前執(zhí)行環(huán)境是函數(shù),那么其活動(dòng)對(duì)象在作用域鏈的前端。 1.幾個(gè)概念 先說幾個(gè)概念:函數(shù)、執(zhí)行環(huán)境、變量對(duì)象、作用域鏈、活動(dòng)對(duì)象。這幾個(gè)東東之間有什么關(guān)系呢,往下看~ 函數(shù) 函數(shù)大家都知道,我想說的是,js中,在函數(shù)內(nèi)部有兩個(gè)特殊...
摘要:至此作用域鏈創(chuàng)建完畢。好了,通過深入理解作用域鏈,我們能跟好的理解的運(yùn)行機(jī)制和閉包的原理。 前言 理解javascript中的作用域和作用域鏈對(duì)我們理解js這們語言。這次想深入的聊下關(guān)于js執(zhí)行的內(nèi)部機(jī)制,主要討論下,作用域,作用域鏈,閉包的概念。為了更好的理解這些東西,我模擬了當(dāng)一個(gè)函數(shù)執(zhí)行時(shí),js引擎做了哪些事情--那些我們看不見的動(dòng)作。 關(guān)鍵詞: 執(zhí)行環(huán)境 作用域 作用域鏈 變...
摘要:在作用域鏈中,外部函數(shù)的活動(dòng)對(duì)象始終處于第二位,外部函數(shù)的外部函數(shù)的活動(dòng)對(duì)象處于第三位,直到作用域鏈終點(diǎn)即全局執(zhí)行環(huán)境。更為重要的是函數(shù)在執(zhí)行完畢后,其他活動(dòng)對(duì)象也不會(huì)被銷毀,因?yàn)槟涿瘮?shù)的作用域鏈仍然在引用這個(gè)活動(dòng)對(duì)象。 原文鏈接----請(qǐng)點(diǎn)這里 ??閉包是指有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù),創(chuàng)建閉包的常見方式,就是在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù)。 ??之所以一個(gè)內(nèi)部的函數(shù)可以...
摘要:首先,在創(chuàng)建函數(shù)時(shí),作用域鏈內(nèi)就會(huì)先填入對(duì)象,圖片只例舉了全部變量中的一部分。然后,解釋器進(jìn)入函數(shù)的執(zhí)行環(huán)境,同樣的,首先填入父級(jí)的作用域鏈,就是的,包括了對(duì)象活動(dòng)對(duì)象。之后再把的活動(dòng)對(duì)象填入到作用域鏈最頂部,這就是的作用域鏈了。 之前學(xué)習(xí)JS函數(shù)部分時(shí),提到了作用域這一節(jié),但是因?yàn)槭褂貌牧蠒煌裉煸谧x博客的時(shí)候發(fā)現(xiàn)其實(shí)還有一個(gè)知識(shí)點(diǎn)即作用域鏈,所以來寫一些個(gè)人理解和認(rèn)識(shí)加深記憶。...
閱讀 1272·2021-11-22 13:54
閱讀 1462·2021-11-22 09:34
閱讀 2749·2021-11-22 09:34
閱讀 4081·2021-10-13 09:39
閱讀 3367·2019-08-26 11:52
閱讀 3393·2019-08-26 11:50
閱讀 1563·2019-08-26 10:56
閱讀 1941·2019-08-26 10:44