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