亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Javascript中的作用域和上下文深入理解

2019-11-20 12:06:49
字體:
來源:轉載
供稿:網友

概述

Javascript中的作用域和上下文的實現是Javascript語言獨有的特性,從某種程度上來說,Javascript語言是十分靈活的。Javascript中的函數可以采用各種各樣的上下文,作用域也可以被封裝和保存。正是由于這些特性,Javascript中也提供了很多很有用的設計模式。然而,作用域和上下文也是Javascript程序員在開發中經常迷惑的地方。
下面會向大家介紹Javascript中作用域和上下文的概念,以及它們的不同。

作用域 VS 上下文

首先要說明的很重要的一點是作用域和上下文并不是同一個概念,它們指代的并不是同一個東西。作為一個前端的菜逼,經常會看到一些文章把這兩個概念弄混,結果有些東西越看越不明白。這兩個概念貌似被混淆了很長一段時間了。因此,查了很多資料,簡單說明下這兩個概念。:stuck_out_tongue_closed_eyes:
在Javascript中,當一個函數被調用時都會有一個作用域和上下文和這個函數綁定在一起。從根本上來說,作用域是基于函數的而上下文是基于對象的。換句話說,作用域適用于函數被調用時函數中變量的訪問權限。上下文通常是指“this”關鍵字的值,“this”是擁有當前執行代碼的對象的引用。

變量作用域

變量可以被定義在局域或全局作用域中,分別稱為局部變量和全局變量。全局變量是指在函數體外聲明的變量,在程序的任何地方都可以訪問全局變量。局部變量是指在函數體內定義的變量,它僅可以在函數體內或者嵌套的函數內被訪問,并且不能在函數外部被訪問。
Javascript目前并不支持塊級作用域(在if、switch、for等語句中定義的變量)。這意味著在塊內定義的變量,在塊外也可以訪問。但是,在ES6中,我們可以使用“let”關鍵字定義塊級作用域。
關于作用域的內容,大家可以查下別的資料,這部分內容相對簡單些。

“this”上下文

上下文(context)通常取決于函數被調用的方式。當函數作為對象的方法被調用時,“this”指代的是調用該函數的對象。

復制代碼 代碼如下:

var obj={
    foo:function (){
        console.log(this === obj);
    }
};
obj.foo();   //輸出true

同樣,當我們使用“new”關鍵字創建新對象時,this引用的是新創建的對象。
復制代碼 代碼如下:

function foo(){
    console.log(this);
}
foo();         //輸出window
var obj=new foo();     //輸出 foo {}

有一點需要注意的是,當全局作用域中的函數被被調用時,this引用的是全局對象,在瀏覽器環境中指的就是window。但是,如果在嚴格模式下運行代碼時,“this”被設置為“undefined”
執行上下文(Execution Context)

Javascript是單線程的語言,這也就是說Javascript在瀏覽器中運行時,一次只能做一件事情,其他的事情將被方法隊列中,等待被處理。

1.當Javascript代碼文件被瀏覽器載入后,默認最新進入的是一個全局的執行上下文。當在全局上下文中調用一個函數時,程序留就進入該被調用函數內,此時Javascript引擎就會為該函數創建一個新的執行上下文,并且將其壓入到執行上下文堆棧的頂部。瀏覽器總是執行當前在堆棧頂部的上下文,一旦執行完畢,該上下文就會從堆棧頂部被彈出,然后,進入其下的上下文執行代碼。這樣,堆棧中的上下文就會被依次執行并且彈出堆棧,直到回到全局的上下文。

2.一個執行上下文可以被分為兩個階段:創建階段和執行階段。在創建階段,javascript解釋器首先會創建一個變量對象(也成為“活動對象”,activation object)?;顒訉ο笥勺兞浚瘮德暶骱蛥到M成。在這個階段,函數的作用域鏈被初始化,this引用的對象也被確定。接下來就是執行階段,在這個階段,代碼被解釋并執行。
在Javascript代碼中,可以有任意多個函數上下文,我們已經知道,當函數被調用時,Javascript解釋器就會創建一個新的上下文,同時會創建一個私有的作用域,函數內部聲明的任何變量都不能在當前函數作用域外部直接訪問。

3.通過上面的解釋,我們對函數的“執行上下文”有了一個基本的概念,但是這里也是大家最容易迷惑的一個地方。Javascript中的“執行上下文”主要是指作用域,而不是上面第四小節中指的“this上下文”。類似的容易混淆的概念在Javascript中還有很多,但是我們只要弄清楚了每個概念所指代的具體對象,就不會再迷惑,因此,這里也希望大家能夠真正的區分開“執行上下文”和“this上下文”。

簡單的一句話概括來說,執行上下文是與作用域相關的概念,雖然這樣說可能不太嚴謹。

作用域鏈

對每一個執行上下文來說,都有一個作用域連跟它綁定在一起。作用域鏈包含了執行上下文堆棧中的執行上下文活動對象(activation object,聽起來有點繞口)。作用域鏈決定了變量的訪問和標識符的解析。

代碼示例:

復制代碼 代碼如下:

function first(){
    second();
    function second(){
        third();
        function third(){
            fourth();
            function fourth(){
                //代碼
            }
        }
    }
}
first();

執行上面的代碼,嵌套的函數都會被執行。就上面的代碼來說,也會形成一個作用域鏈,作用域鏈從頂部到底部的順序為:fourth, third, second, first, global。函數fourth可以訪問全局作用域中的變量,并且可以訪問函數third, second, first中定義的任何變量。
有一點需要注意的是,在函數體內,局部變量的優先級高于同名的全局變量。如果在函數內聲明的局部變量或函數參數中帶有的變量和全局變量重名,那么全局變量就被局部變量所覆蓋。
簡單來說,每次我們嘗試訪問一個變量時,程序都會在當前函數作用域內查找變量,如果找不到就沿著作用域鏈到該函數的上層去查找,直到找到該變量為止,如果找不到則返回undefined。

總結

這篇文章介紹了javascript中上下文和作用域的相關概念,javascript中還有幾個比較重要的概念,如閉包等,這些在以后自己弄明白了會寫成文章~~

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线精品国产欧美| 在线不卡国产精品| 色偷偷av一区二区三区乱| 日韩av成人在线观看| 久久久久久久久国产| 日韩中文字幕在线视频播放| 欧美激情免费看| 久久免费视频在线| 欧美—级a级欧美特级ar全黄| 成人午夜两性视频| 亚洲国产精品一区二区三区| 国产欧美一区二区三区久久| 黄色一区二区在线| 日韩av最新在线| 国产盗摄xxxx视频xxx69| 亚洲天堂成人在线| 亚洲最新在线视频| 91久久精品视频| 成人福利视频在线观看| 日韩电影免费观看中文字幕| 欧美性猛交xxxx偷拍洗澡| 国产精品一区二区性色av| 成人疯狂猛交xxx| 亚洲电影免费观看高清完整版在线| 91亚洲午夜在线| 欧美肥老太性生活视频| 色噜噜亚洲精品中文字幕| 国产精品igao视频| 亚洲人成五月天| 69久久夜色精品国产69| 久久久久久国产精品美女| 亚洲成人动漫在线播放| 亚洲欧美精品suv| 亚洲欧美日韩第一区| 亚洲一区二区三区777| 成人福利在线视频| 久久久久99精品久久久久| 亚洲一区二区三区xxx视频| 国产伊人精品在线| 日韩成人在线网站| 国产精品激情av在线播放| 午夜剧场成人观在线视频免费观看| 精品福利一区二区| 日韩在线免费高清视频| 亚洲欧美国产日韩天堂区| 中文字幕日韩欧美精品在线观看| 久久视频在线免费观看| 九九热精品视频| 亚洲一区二区三区乱码aⅴ| 国产精品福利在线观看| 欧美理论电影在线播放| 欧美日韩在线影院| 欧美日韩一区二区在线播放| 亚洲福利在线观看| 中文字幕日韩在线视频| 欧美国产日韩中文字幕在线| 欧美视频二区36p| 一二美女精品欧洲| 欧美精品激情在线观看| 亚洲欧洲在线看| 97视频在线免费观看| 日韩欧美精品网址| 国产91久久婷婷一区二区| 国产视频精品免费播放| 色偷偷噜噜噜亚洲男人的天堂| 国产精品 欧美在线| 欧美一区在线直播| 久久视频在线直播| 欧美视频中文字幕在线| 久久成人av网站| 国产精品无av码在线观看| 91中文字幕在线| 懂色av中文一区二区三区天美| 亚洲综合中文字幕在线观看| 国产日韩欧美在线| 亚洲欧美日韩国产中文| 俺也去精品视频在线观看| 国模精品一区二区三区色天香| 91国产精品视频在线| 欧美老女人www| 亚洲一级免费视频| 亚洲精品久久久久中文字幕二区| 国产亚洲成av人片在线观看桃| 日韩欧美aaa| 日韩av黄色在线观看| 狠狠色狠狠色综合日日小说| 欧美国产视频一区二区| 日韩欧美国产视频| 日韩精品丝袜在线| 亚洲一区二区三区在线免费观看| 538国产精品一区二区在线| 日韩av毛片网| 人体精品一二三区| 成人www视频在线观看| 久久精品视频中文字幕| 亚洲精品理论电影| 国产精品你懂得| 久久久国产一区| 亚洲欧洲国产伦综合| 91色在线视频| 亚洲欧洲在线视频| 久久免费高清视频| 久久中国妇女中文字幕| 九九视频这里只有精品| 久久久久日韩精品久久久男男| 国产成人短视频| 亚洲已满18点击进入在线看片| 欧美日韩亚洲国产一区| 国产91精品久久久久久| 91欧美视频网站| 日韩一区二区福利| 久久久久久久久久久亚洲| 成人福利网站在线观看| 日本精品久久中文字幕佐佐木| 日韩美女主播视频| 91精品久久久久久久久久久久久久| 欧美大全免费观看电视剧大泉洋| 色婷婷综合久久久久中文字幕1| 海角国产乱辈乱精品视频| 亚洲成人精品久久久| 国产精品美女免费| 亚洲春色另类小说| 亚洲精品福利视频| xxx一区二区| 亚洲精品色婷婷福利天堂| 欧美午夜xxx| 亚洲免费一级电影| 国产精品一区二区三区久久久| 另类专区欧美制服同性| 久久影视电视剧凤归四时歌| 久久久久久av| 91久久在线播放| 欧美一级黑人aaaaaaa做受| 国产有码在线一区二区视频| 欧美激情免费看| 国产精品久久久久久久7电影| 4444欧美成人kkkk| 92福利视频午夜1000合集在线观看| 久久国产天堂福利天堂| 欧美成人激情视频| 在线观看久久久久久| 欧美性生交大片免费| 久久久日本电影| 久久福利视频网| 亚洲激情小视频| 影音先锋欧美精品| 国产精品视频在线观看| 亚洲欧美制服综合另类| 热草久综合在线| 久久人91精品久久久久久不卡| 欧美不卡视频一区发布| 精品久久久久久久久久久久久| 亚洲女性裸体视频| 国产成人综合一区二区三区| xvideos成人免费中文版| 奇门遁甲1982国语版免费观看高清| 亚洲一区二区三区sesese| 欧美精品18videosex性欧美| 亚洲免费视频在线观看| 欧美极品少妇xxxxⅹ免费视频| 欧美体内谢she精2性欧美| 国产免费久久av| 国产91在线播放九色快色| 日韩欧美一区二区三区|