成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

執(zhí)行環(huán)境及作用域

zhoutk / 310人閱讀

摘要:每個環(huán)境都可以向上搜索作用域鏈以查詢變量和函數(shù)名但任何環(huán)境都不能通過向下搜索作用域鏈而進入另一個執(zhí)行環(huán)境。

執(zhí)行環(huán)境(execution context,為簡單起見,有時也稱為“環(huán)境”)是 JavaScript 中最為重要的一個概念。執(zhí)行環(huán)境定義了變量或函數(shù)有權(quán)訪問的其他數(shù)據(jù),決定了它們各自的行為。每個執(zhí)行環(huán)境都有一個與之關(guān)聯(lián)的變量對象(variable object),環(huán)境中定義的所有變量和函數(shù)都保存在這個對象中。雖然我們編寫的代碼無法訪問這個對象,但解析器在處理數(shù)據(jù)時會在后臺使用它。

全局執(zhí)行環(huán)境是最外圍的一個執(zhí)行環(huán)境。根據(jù) ECMAScript 實現(xiàn)所在的宿主環(huán)境不同,表示執(zhí)行環(huán),因境的對象也不一樣。在 Web 瀏覽器中,全局執(zhí)行環(huán)境被認為是 window 對象(第 7 章將詳細討論)
此所有全局變量和函數(shù)都是作為 window 對象的屬性和方法創(chuàng)建的。某個執(zhí)行環(huán)境中的所有代碼執(zhí)行完畢后,該環(huán)境被銷毀,保存在其中的所有變量和函數(shù)定義也隨之銷毀(全局執(zhí)行環(huán)境直到應(yīng)用程序退
出——例如關(guān)閉網(wǎng)頁或瀏覽器——時才會被銷毀)。

每個函數(shù)都有自己的執(zhí)行環(huán)境。當執(zhí)行流進入一個函數(shù)時,函數(shù)的環(huán)境就會被推入一個環(huán)境棧中。而在函數(shù)執(zhí)行之后,棧將其環(huán)境彈出,把控制權(quán)返回給之前的執(zhí)行環(huán)境。ECMAScript 程序中的執(zhí)行流正是由這個方便的機制控制著。

當代碼在一個環(huán)境中執(zhí)行時,會創(chuàng)建變量對象的一個作用域鏈(scope chain)。作用域鏈的用途,是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。作用域鏈的前端,始終都是當前執(zhí)行的代碼所在環(huán)境的變量對象。如果這個環(huán)境是函數(shù),則將其活動對象(activation object)作為變量對象?;顒訉ο笤谧铋_始時只包含一個變量,即 arguments 對象(這個對象在全局環(huán)境中是不存在的)。作用域鏈中的下一個變量對象來自包含(外部)環(huán)境,而再下一個變量對象則來自下一個包含環(huán)境。這樣,一直延續(xù)到全局執(zhí)行環(huán)境;全局執(zhí)行環(huán)境的變量對象始終都是作用域鏈中的最后一個對象。

標識符解析是沿著作用域鏈一級一級地搜索標識符的過程。搜索過程始終從作用域鏈的前端開始,
然后逐級地向后回溯,直至找到標識符為止(如果找不到標識符,通常會導(dǎo)致錯誤發(fā)生)。

在局部作用域中定義的變量可以在局部環(huán)境中與全局變量互換使用,如下面這個例子所示:

var color = "blue";
function changeColor(){
    var anotherColor = "red";
    function swapColors(){
        var tempColor = anotherColor;
        anotherColor = color;
        color = tempColor;
        // 這里可以訪問 color、anotherColor 和 tempColor
    }
    // 這里可以訪問 color 和 anotherColor,但不能訪問 tempColor
    swapColors();
}
// 這里只能訪問 color
changeColor();

以上代碼共涉及 3 個執(zhí)行環(huán)境:全局環(huán)境、 changeColor() 的局部環(huán)境和 swapColors() 的局部
環(huán)境。全局環(huán)境中有一個變量 color 和一個函數(shù) changeColor() 。 changeColor() 的局部環(huán)境中有一個名為 anotherColor 的變量和一個名為 swapColors() 的函數(shù),但它也可以訪問全局環(huán)境中的變量 color 。 swapColors() 的局部環(huán)境中有一個變量 tempColor ,該變量只能在這個環(huán)境中訪問到。無論全局環(huán)境還是 changeColor() 的局部環(huán)境都無權(quán)訪問 tempColor 。然而,在 swapColors() 內(nèi)部則可以訪問其他兩個環(huán)境中的所有變量,因為那兩個環(huán)境是它的父執(zhí)行環(huán)境。圖 4-3 形象地展示了前面這個例子的作用域鏈。

圖中的矩形表示特定的執(zhí)行環(huán)境。其中,內(nèi)部環(huán)境可以通過作用域鏈訪問所有的外部環(huán)境,但
外部環(huán)境不能訪問內(nèi)部環(huán)境中的任何變量和函數(shù)。這些環(huán)境之間的聯(lián)系是線性、有次序的。每個環(huán)境都
可以向上搜索作用域鏈,以查詢變量和函數(shù)名;但任何環(huán)境都不能通過向下搜索作用域鏈而進入另一個
執(zhí)行環(huán)境。對于這個例子中的 swapColors() 而言,其作用域鏈中包含 3 個對象: swapColors() 的變量對象、 changeColor() 的變量對象和全局變量對象。 swapColors() 的局部環(huán)境開始時會先在自己的變量對象中搜索變量和函數(shù)名,如果搜索不到則再搜索上一級作用域鏈。 changeColor() 的作用域鏈中只包含兩個對象:它自己的變量對象和全局變量對象。這也就是說,它不能訪問swapColors() 的環(huán)境。

函數(shù)參數(shù)也被當作變量來對待,因此其訪問規(guī)則與執(zhí)行環(huán)境中的其他變量相同。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/85331.html

相關(guān)文章

  • javascript中執(zhí)行環(huán)境作用的理解

    摘要:作用域鏈的用途,是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。這樣,一直延續(xù)到全局執(zhí)行環(huán)境全局執(zhí)行環(huán)境的變量對象始終都是作用域鏈中的最后一個對象。標識符解析是沿著作用域鏈一級一級地搜索標識符的過程。 執(zhí)行環(huán)境(execution context,為簡單起見,有時也成為環(huán)境)是javascript中最為重要的一個概念。執(zhí)行環(huán)境定義了變量或函數(shù)有權(quán)訪問的其他數(shù)據(jù),決定了它們各自...

    BearyChat 評論0 收藏0
  • 詳解js變量、作用內(nèi)存

    摘要:不是引用類型,無法輸出簡而言之,堆內(nèi)存存放引用值,棧內(nèi)存存放固定類型值。變量的查詢在變量的查詢中,訪問局部變量要比全局變量來得快,因此不需要向上搜索作用域鏈。 贊助我以寫出更好的文章,give me a cup of coffee? 2017最新最全前端面試題 基本類型值有:undefined,NUll,Boolean,Number和String,這些類型分別在內(nèi)存中占有固定的大小空...

    waltr 評論0 收藏0
  • 圖解作用閉包

    摘要:那其實閉包的原因就是外層函數(shù)的作用域?qū)ο鬅o法釋放其實就是一個函數(shù)調(diào)用會生成的臨時作用域圖中可看出其實就是在中的匿名函數(shù),所以他的就指向留下的作用域。 引言 網(wǎng)絡(luò)上關(guān)于作用域及閉包的文章很多,自己對于純理論知識并不能很快的理解,但自己對于圖畫有很強的記憶和理解能力,因此決定將此知識點以圖畫的知識表現(xiàn)出來,加深自身理解的同時如果能幫到正在學(xué)習(xí)的童鞋就再好不過了 下面我以函數(shù)的整個生命周期來...

    shiyang6017 評論0 收藏0
  • JS之作用淺談

    摘要:作用域鏈保證對環(huán)境中定義的變量和函數(shù)的有序訪問。通俗來說,執(zhí)行環(huán)境和作用域就是變量或函數(shù)有效執(zhí)行所在的一個環(huán)境??偨Y(jié)要想搞清作用域,首先要搞清預(yù)解析,然后判斷作用域范圍,先判斷本層環(huán)境有無聲明及賦值,如果有聲明,則判斷調(diào)用前是否賦值。 這幾天看了一下JS高級程序設(shè)計里的介紹作用域的章節(jié),也參考了網(wǎng)上的資料,現(xiàn)在結(jié)合著自己的理解,給大家分享一下我自己對JS作用域的理解。 作用域及執(zhí)行環(huán)境...

    roland_reed 評論0 收藏0
  • 結(jié)合作用,執(zhí)行上下文圖解閉包

    摘要:作用域鏈所謂作用域鏈,是由當前環(huán)境與上層環(huán)境的一系列變量對象組成,它保證當前執(zhí)行環(huán)境對符合訪問權(quán)限的變量和函數(shù)的有序訪問。當我們在執(zhí)行函數(shù)的時候,需要的變量,在自己的作用域內(nèi)找不到,便會順著作用域鏈往上找,直到找到全局作用域。 一 作用域相關(guān)? ? ? 作用域是一套規(guī)則,用來管理引擎如何查找變量。在es5之前,js只有全局作用域及函數(shù)作用域。es6引入了塊級作用域。但是這個塊級別作用域...

    msup 評論0 收藏0

發(fā)表評論

0條評論

zhoutk

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<