在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 網頁設計教程 > 詳細頁面

ES5中執行環境與作用域的詳細介紹(代碼示例)

ES5中執行環境與作用域的詳細介紹(代碼示例)

更新時間:2025-12-08 文章作者:未知 信息來源:網絡 閱讀次數:

網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立...
網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立在超文本基礎之上的。超級文本標記語言之所以稱為超文本標記語言,是因為文本中包含了所謂“超級鏈接”點。
本篇文章給大家帶來的內容是關于ES5中執行環境和作用域的詳細介紹(代碼示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

前言:最近在細讀Javascript高級程序設計,對于我而言,中文版,書中很多地方一筆帶過,所以用自己所理解的,嘗試細致解讀下。如有紕漏或錯誤,會非常感謝您的指出。文中絕大部分內容引用自《JavaScript高級程序設計第三版》

執行環境(execution context)

執行環境(execution context,為了簡單起見,有時也成為環境)是JavaScript中最為重要的一個概念。

執行環境,定義了變量或函數有權訪問其他數據,且決定了它們各自的行為。

每個執行環境都有一個與之關聯的變量對象(variable object),環境中定義的所有變量和函數都保存在這個對象中。

雖然我們編寫的代碼無法訪問這個對象,但解析器在處理數據時會在后臺使用它。

全局執行環境時最外圍的一個執行環境。

根據ECMAScript實現所在的宿主環境不同,表示執行環境的對象也不一樣。

在Web瀏覽器中,全局執行環境被認為是window對象,因此所有全局變量和函數都是作為window對象的屬性和方法創建的。

(變量的生命周期),某個執行環境中的所有代碼執行完畢后,該環境被銷毀,保存在其中的所有變量和函數定義也隨之銷毀)

全局執行環境直到應用程序退出——例如關閉網頁或瀏覽器時才會被銷毀。

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

作用域鏈(scope chain)

當代碼在一個環境中執行時,會創建變量對象的一個作用域鏈(scope chain)。
作用域鏈的用途,是保證對執行環境,有權訪問的所有變量和函數的有序訪問。

作用域鏈的前端,始終都是當前執行的代碼所在環境的變量對象。(也可以理解為“就近原則”)。

如果這個環境是函數,則將其活動對象(activation object)作為變量對象。

函數執行環境中的活動對象在最開始時,只包含一個變量,即arguments對象(這個對象在全局環境中是不存在的)作為變量對象。

作用域鏈中的下一個變量對象來自包含(外部)環境,而再下一個變量對象則來自下一個包含環境,這樣,一直延續到全局執行環境。

全局執行環境的變量對象,始終是作用域鏈中的最后一個對象。

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

var color = "blue";

function changeColor() {
    if(color === "blue") {
        color = "red";
    } else {
        color = "blue";
    }
}

changeColor();

console.log("Color is now " + color); // "color is now red"

在這個簡單的例子中,函數changeColor()的作用域鏈包含兩個對象:

它自己的變量對象(其中定義著arguments對象)和全局環境的變量對象。

可以在函數內部訪問變量color,就是因為可以在這個作用域鏈中找到它。

此外,在局部作用中定義的變量可以在局部環境中與全局變量互換使用。

var color = "blue";

function changeColor() {
    var anotherColor = "red";

    function swapColors(){

        //這里可以訪問color、anotherColor和tempColor
        var tempColor = anotherColor;
        anotherColor = color;
        color = tempColor;
    }

    //這里可以訪問color和anotherColor,但不能訪問tempColor
    swapColors();
}

//這里只能訪問color
changeColor();

以上代碼,涉及3個執行環境:

  • 全局環境(在web瀏覽器中就是window)

  • 函數changeColor()的局部環境

  • 函數swapColors()的局部局部

全局環境中有一個變量color和一個函數changeColor()。changeColor()的局部環境中有一個名為anotherColor的變量和一個名為swapColors()的函數,但它也可以訪問全局環境中的變量color。swapColors()的局部環境中有一個變量tempColor,該變量只能在這個環境中訪問到。

無論全局環境還是changeColor()的局部環境都無權訪問tempColor。

然而,在swapColors()內部,則可以訪問其他兩個環境中的變量,因為那兩個環境是它的父執行環境。

      
 window, color, changeColor()
            |
    anotherColor, swapColors()
                    |
                tempColor

內部環境可以通過作用域鏈訪問所有的外部環境,但外部環境不能訪問內部環境中的任何變量和函數。

這些環境之間的聯系是線性、有次序的。

每個環境都可以向上搜索作用域鏈,以查詢變量和函數名。但是,任何環境都不能通過向下搜索作用域鏈而進入另一個執行環境。

函數參數也被當做變量來對待,因此其訪問規則與執行環境中的其他變量相同。

沒有塊級作用域(ES5中沒有)

JavaScript沒有塊級作用域經常會導致理解上的困惑。
在其他類C的語言中,由花括號封閉的代碼塊都有自己的作用域(如果用ECMAScript的話來講,就是它們自己的執行環境),因而支持根據條件來定義變量。

if(true) {
    var color = "blue";
}

console.log(color); //"blue"

這里是在有一個if語句中定義了變量color。
如果是在C、C++或Java中,color會在if語句執行完畢后被銷毀。
但在JavaScript中,if語句中的變量聲明會將變量添加當前的執行環境(在這里是全局環境window)中。

在使用for語句時尤其要牢記這一差異。

for(var i = 0; i < 10; i++) {
    console.log(i); // 0,1,2,3,4,5,6,7,8,9
}

/*
//等價于
var i;

for(i = 0; i < 10; i++) {
    console.log(i);
}

*/

console.log(i); //10

對于有塊級作用域的語言來說,for語句初始化變量的表達式所定義的變量,只會存在于循壞的環境之中。而對于JavaScript來說,由for語句創建的變量i即使在for循環結束之后,也依舊會存在于循壞外部的執行環境中。

聲明變量

使用var聲明的變量會自動被添加到最接近的環境中,在函數內部,最接近的環境就是函數的局部環境。

如果初始化變量時沒有使用var聲明,該變量會自動被添加到全局作用域。

function add(num1, num2) {
    var sum = num1 + num2;
    return sum;
}

var result = add(10,20); //30
console.log(sum); //sum is not defined

以上代碼中的函數add()定義了一個名為sum的局部變量,該變量包含加法操作的結果。
雖然結果值從函數中返回了,但變量sum在函數外部是訪問不到的。
如果省略這個例子中的var關鍵字,那么當add()執行完畢后,sum也將可以訪問到。

function add(num1, num2) {
    sum = num1 + num2;
    return sum;
}

var result = add(10,20); // 30
console.log(sum); 30

在這個例子中的變量sum在被初始化賦值時沒有使用var關鍵字。
于是,當調用完add()之后,添加到全局環境中的變量sum將繼續存在。
即使函數已經執行完畢,后面的代碼依舊可以訪問它。

在編寫JavaScript代碼的過程中,不聲明而直接初始化變量時一個常見的錯誤,這樣會導致一些不可預估的意外。養成良好的習慣,在初始化變量之前,一定要先聲明,這樣就可以避免類似問題。在嚴格模式下,初始化未經聲明的變量會導致錯誤。

2.查詢標識符

當在某個環境中為了讀取或寫入而引用一個標識符時,必須通過搜索來確定該標識符實際代表什么。搜索過程從作用域鏈的前端開始,向上逐級查詢與給定名字匹配的標識符。

如果在局部環境中找到了該標識符,搜索過程停止,變量就緒。

如果在局部環境中沒有找到該變量,則繼續沿作用域向上搜索。

搜索過程將一直追溯到全局環境的變量對象。

如果在全局環境中也沒有找到這個標識符,則意味著該變量尚未聲明。

var color = "blue";

function getColor() {
    return color;
}

console.log(getColor()); // "blue"

/*
window = {
    color,
    getColor = function() {
        return color;
    }
}
*/

調用本例中的函數getColor()時會引用變量color。

為了確定變量color的值,將開始一個兩步的搜索過程。

  • 首先,在getColor()的局部環境中搜索變量對象,查找其中是否包含一個名為color的標識符。

  • 然后,沒有找到,對不?那就到外面的環境中找,在全局作用域中找到名為color的標識符。

搜索到了定義這個變量的變量對象,搜索過程宣告結束。

在這個搜索過程中,如果存在一個局部的變量的定義,則搜索會自動停止(找到了,我就不找了),不再進入另一個變量對象。換句話說,如果局部環境中存在著同名標識符,就不會使用位于父環境中的標識符。

var color = "blue";

function getColor() {
    var color = "red";
    return color;
}

console.log(getColor()); //"red"

修改后的代碼在getColor()函數中聲明了一個名為color的局部變量。
調用函數時,該變量就會被聲明。而當函數中的第二行代碼執行時,意味著必須找到并返回變量color的值。
搜索過程,首先從局部環境中開始,而且在這里發現了一個名為color的變量,其值為“red”。
變量已經在函數的局部環境中找到了,所以搜索停止,return語句就使用這個局部變量,并為函數返回“red”。

如果不使用window.color都無法訪問全局color變量。

變量查詢也不是沒有代價的。很明顯,訪問局部變量要比訪問全局變量更快,因為不用向上搜索作用域鏈。JavaScript引擎在優化標識符查詢方面做得不錯,因此這個差別在將來恐怕可以忽略不記。

但是,我們還是要養成良好的編程習慣。雖說,這個差別可以忽略不記。

以上就是ES5中執行環境和作用域的詳細介紹(代碼示例)的詳細內容,更多請關注php中文網其它相關文章!


網站建設是一個廣義的術語,涵蓋了許多不同的技能和學科中所使用的生產和維護的網站。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 色国产在线视频| 最新av网址在线观看| 黄色特一级视频| 国产又猛又黄的视频| 丰满爆乳一区二区三区| www插插插无码视频网站| 亚洲成人动漫在线| 久久久国产精华液999999 | 色呦色呦色精品| 手机在线看福利| 亚洲一区二区三区四区五区xx| 国产最新免费视频| 成年人小视频网站| 国产喷水theporn| 高清av免费看| 久久艹这里只有精品| 大片在线观看网站免费收看| 国产专区在线视频| 男女猛烈激情xx00免费视频| 欧美日韩性生活片| 久久婷五月综合| 亚洲第一综合网站| 少妇人妻在线视频| 少妇一级淫免费放| 久久国产精品免费观看| 欧美视频在线观看视频| 91看片就是不一样| 欧美日韩久久婷婷| 无码熟妇人妻av在线电影| av免费中文字幕| 精品亚洲视频在线| www精品久久| 欧美自拍小视频| av电影一区二区三区| 日日碰狠狠添天天爽超碰97| 57pao国产成永久免费视频| 蜜臀av性久久久久蜜臀av| 亚洲熟妇av一区二区三区| 亚洲一区日韩精品| 亚洲人成无码网站久久99热国产| 别急慢慢来1978如如2| 国产在线视频综合| 亚洲一级免费观看| 蜜臀av色欲a片无码精品一区| 日本男人操女人| 4444在线观看| 中文字幕66页| 大肉大捧一进一出好爽动态图| 亚洲一二三av| 激情婷婷综合网| 韩日视频在线观看| 久久久国产精华液999999| 欧美日韩性生活片| 免费看日b视频| 亚洲国产午夜精品| 色哟哟精品视频| 九九九九免费视频| 欧美日韩福利在线| 麻豆映画在线观看| 色一情一区二区三区| 苍井空浴缸大战猛男120分钟| 草草视频在线免费观看| 日韩精品视频网址| 超碰在线资源站| 天堂视频免费看| 手机在线免费观看毛片| 女性隐私黄www网站视频| 日本www在线视频| 丁香六月激情婷婷| 日韩亚洲欧美视频| 成人午夜精品久久久久久久蜜臀| av动漫在线播放| 亚洲精品少妇一区二区| 久久手机在线视频| 草草视频在线免费观看| 国产婷婷一区二区三区| 日韩精品―中文字幕| 女人扒开屁股爽桶30分钟| 欧美成人免费在线观看视频| 国产成人无码精品久久久性色| 人妻少妇精品无码专区二区| 奇米精品一区二区三区| 亚洲精品乱码久久久久久自慰| 国产欧美高清在线| 国产探花在线看| 久久出品必属精品| 日本男女交配视频| 美女av免费在线观看| 男人插女人下面免费视频| 国产喷水theporn| 日本一区二区三区四区五区六区| 国内少妇毛片视频| 国产精品亚洲a| 色姑娘综合天天| 国产极品在线视频| 国内外成人免费在线视频| 伊人网在线免费| 日韩毛片在线免费看| 99中文字幕在线| 国产精品专区在线| 8x8x成人免费视频| 国产青青在线视频| 成年人三级黄色片| 久久这里只有精品18| 日韩爱爱小视频| 日本十八禁视频无遮挡| 依人在线免费视频| 岛国大片在线播放| 欧洲美女亚洲激情| 麻豆av免费在线| 免费日韩在线观看| www.com操| 日韩在线一级片| 欧美性受黑人性爽| 粉色视频免费看| 欧美牲交a欧美牲交aⅴ免费真 | 欧美亚洲日本在线观看| youjizz.com在线观看| 激情视频免费网站| 亚洲爆乳无码专区| 欧美视频在线观看视频| 亚洲免费视频播放| 在线不卡一区二区三区| 好男人www社区| 免费在线激情视频| 无码播放一区二区三区| 无码毛片aaa在线| 久久精品视频在线观看免费| 久久午夜夜伦鲁鲁一区二区| 久久国产乱子伦免费精品| 黄色一级视频在线播放| 亚洲色成人www永久在线观看 | 日韩中文字幕亚洲精品欧美| 艳母动漫在线免费观看| 天天色天天干天天色| 日韩av一卡二卡三卡| 91制片厂毛片| 男生操女生视频在线观看 | 国产成人综合一区| 国产成人精品无码播放| 黄色三级视频片| 日本激情综合网| www.色.com| 久久综合亚洲精品| av免费观看国产| 三级4级全黄60分钟| 男人天堂成人在线| 天天干天天操天天做| 亚洲一区二区偷拍| 成人午夜免费在线视频| 欧美黑人在线观看| 久久精品国产精品亚洲色婷婷| 欧美 国产 日本| 欧美成年人视频在线观看| 亚洲女人在线观看| 欧美精品在欧美一区二区| 日本福利视频一区| 中文字幕视频在线免费观看| 在线不卡一区二区三区| 91精品一区二区三区四区| 9久久9毛片又大又硬又粗| 国产情侣av自拍| 强伦女教师2:伦理在线观看| 三上悠亚久久精品| 欧美大尺度做爰床戏| 日本高清xxxx| 99草草国产熟女视频在线| 尤物国产在线观看| 久久亚洲国产成人精品无码区| 精品99在线视频| 男插女免费视频| 久久成人免费观看| 超碰在线免费av| 无码无遮挡又大又爽又黄的视频| 91小视频在线播放| 欧美精品一区免费| 中文字幕55页| 成年人在线观看视频免费| 欧美精品在欧美一区二区| 男女无套免费视频网站动漫| 欧美日韩视频免费| 国产性生交xxxxx免费| 久艹视频在线免费观看| 另类小说色综合| 国产精品一区在线免费观看| 欧美 日韩 国产 高清| 国产福利一区视频| 国产精品少妇在线视频| 国产精品亚洲a| 国产精品久久久久久9999| 亚洲一级免费观看| 91社在线播放| 精品久久久久久久久久中文字幕| 国产精品宾馆在线精品酒店| 国产极品美女高潮无套久久久| 男女爽爽爽视频| 日本欧美视频在线观看| 国产女同无遮挡互慰高潮91| 激情文学亚洲色图| 噼里啪啦国语在线观看免费版高清版|