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

資訊專欄INFORMATION COLUMN

JavaScript-作用域、塊級作用域、上下文、執(zhí)行上下文、作用域鏈

Coding01 / 3569人閱讀

摘要:一旦函數(shù)執(zhí)行完成,其就會從作用域鏈頂部移除,并且執(zhí)行權會返回到函數(shù)。攀爬作用域鏈當不同執(zhí)行上下文之間存在變量命名沖突,可以通過攀爬作用域鏈解決從頂部到底部。

一、作用域
在 JavaScript 中, 作用域(scope,或譯有效范圍)就是變量和函數(shù)的可訪問范圍,即作用域控制著變量和函數(shù)的可見性生命周期
二、全局/局部作用域 2.1 全局作用域(Global Scope)

(1)不在任何函數(shù)內(nèi)定義的變量就具有全局作用域。

(2)實際上,JavaScript默認有一個全局對象window,全局作用域的變量實際上被綁定到window的一個屬性。

(3)window對象的內(nèi)置屬性都擁有全局作用域,例如 window.name、window.location、window.top 等。

2.2 局部作用域(Local Scope)

(1)JavaScript的作用域是通過函數(shù)來定義的,在一個函數(shù)中定義的變量只對這個函數(shù)內(nèi)部可見,稱為函數(shù)(局部)作用域。

三、全局/局部變量
變量能夠被定義在局部或者全局作用域,這導致運行時變量的訪問來自不同的作用域。
3.1 全局變量

(1)在函數(shù)定義外聲明的變量是全局變量。

(2)全局變量有 全局作用域,它的值可在整個程序中訪問和修改。

(3)如果變量在函數(shù)內(nèi)沒有聲明(沒有使用 var 關鍵字),該變量為全局變量。

3.2 局部變量

(1)在函數(shù)定義內(nèi)聲明的變量是局部變量。

(2)因為局部變量只作用于函數(shù)內(nèi),所以不同的函數(shù)可以使用相同名稱的變量。

(3)每當執(zhí)行函數(shù)時,都會創(chuàng)建銷毀該變量,且無法通過函數(shù)之外的任何代碼訪問該變量。

(4)函數(shù)外無法訪問函數(shù)內(nèi)的變量,函數(shù)內(nèi)卻可以訪問函數(shù)外的變量。

四、全局變量
1、在函數(shù)定義外聲明的變量是全局變量;全局變量有全局作用域,它的值可在整個程序中訪問和修改

2、如果變量在函數(shù)內(nèi)沒有聲明(沒有使用 var 關鍵字),該變量為全局變量。

五、局部變量
1、因為局部變量只作用于函數(shù)內(nèi),所以不同的函數(shù)可以使用相同名稱的變量

2、每當執(zhí)行函數(shù)時,都會創(chuàng)建銷毀該變量,且無法通過函數(shù)之外的任何代碼訪問該變量。

3、函數(shù)外無法訪問函數(shù)內(nèi)的變量,函數(shù)內(nèi)卻可以訪問函數(shù)外的變量。

六、塊級作用域 6.1 概念
塊級作用域指在If語句,switch語句,循環(huán)語句等語句塊中定義變量,這意味著變量不能在語句塊之外被訪問。
6.2 var 不支持塊級作用域

(1)在If等語句塊中,定義的變量從屬于該塊所在的作用域,和函數(shù)不同,他們不會創(chuàng)建新的作用域。

6.3 let和const

(1)為了解決塊級作用域,ES6引入了 letconst 關鍵字,可以聲明一個塊級作用域的變量。

(2)全局作用域的生存周期與上述應用相同。局部作用域只在該函數(shù)調(diào)用執(zhí)行期間存在。

七、上下文 vs 作用域

(1)首先需要說明的是上下文和作用域是不同的概念。

(2)每個函數(shù)調(diào)用都有與之相關的作用域和上下文。從根本上說,作用域是基于函數(shù),而上下文是基于對象。

(3)作用域是和每次函數(shù)調(diào)用時變量的訪問有關,并且每次調(diào)用都是獨立的。上下文總是關鍵字 this 的值,是調(diào)用當前可執(zhí)行代碼的對象的引用。

八、“this” 上下文

(1)上下文通常是取決于一個函數(shù)如何被調(diào)用。當函數(shù)作為對象的方法被調(diào)用時,this 指向調(diào)用方法的對象。

(2)當調(diào)用一個函數(shù)時,通過 new 操作符創(chuàng)建一個對象的實例,當以這種方式調(diào)用時,this 指向新創(chuàng)建的實例

(3)當調(diào)用一個未綁定函數(shù),this 默認指向全局上下文或者瀏覽器中的window對象。然而如果函數(shù)在嚴格模式下被執(zhí)行(“use strict”),this 默認指向 undefined。

九、執(zhí)行上下文

(1)當函數(shù)執(zhí)行時,會創(chuàng)建一個稱為執(zhí)行上下文的內(nèi)部對象(可理解為作用域,不是前面討論的上下文)。一個執(zhí)行上下文定義了一個函數(shù)執(zhí)行時的環(huán)境。

(2)函數(shù)每次執(zhí)行時對應的執(zhí)行上下文都是獨一無二的,所以多次調(diào)用一個函數(shù)會導致創(chuàng)建多個執(zhí)行上下文。

(3)當javascript代碼文件被瀏覽器載入后,默認最先進入的是一個全局的執(zhí)行上下文。當在全局上下文中調(diào)用執(zhí)行一個函數(shù)時,程序流就進入該被調(diào)用函數(shù)內(nèi),此時引擎就會為該函數(shù)創(chuàng)建一個新的執(zhí)行上下文,并且將其壓入到執(zhí)行棧頂部(作用域鏈)。瀏覽器總是執(zhí)行位于執(zhí)行棧頂部的當前執(zhí)行上下文,一旦執(zhí)行完畢,該執(zhí)行上下文就會從執(zhí)行棧頂部彈出,并且控制權將進入其下的執(zhí)行上下文。這樣,執(zhí)行棧中的執(zhí)行上下文就會被依次執(zhí)行并且彈出,直到回到全局的執(zhí)行上下文。

十、作用域鏈

(1)在JavaScript中,函數(shù)也是對象,對象中有些屬性我們可以訪問,但有些不可以(訪問),這些屬性僅供JavaScript引擎存取,[[scope]]就是其中一個。

(2)[[scope]]指的就是我們所說的作用域,其中存儲了執(zhí)行上下文的集合。

(3)[[scope]]中所存儲的執(zhí)行上下文對象的集合,這個集合呈鏈式鏈接,我們把這種鏈式鏈接叫做作用域鏈。

10.1 示例

(1)運行示例代碼將會導致嵌套的函數(shù)被從上倒下執(zhí)行,一直到 fourth 函數(shù),此時作用域鏈從上到下為: fourth, third, second, first, global。

(2)fourth 函數(shù)能夠訪問全局變量和任何定義在first,second和third函數(shù)中的變量(和訪問自己的變量一樣)。

(3)一旦fourth函數(shù)執(zhí)行完成,其就會從作用域鏈頂部移除,并且執(zhí)行權會返回到third函數(shù)。這個過程一直持續(xù)到所有代碼完成執(zhí)行。

10.2 攀爬作用域鏈

(1)當不同執(zhí)行上下文之間存在 變量命名沖突,可以通過攀爬作用域鏈解決(從頂部到底部)。這也就是說
在最內(nèi)層函數(shù)(執(zhí)行棧頂部的執(zhí)行上下文)中,具有相同變量名稱的變量將具有較高優(yōu)先級。

(2)簡單的說,每次試圖訪問函數(shù)執(zhí)行上下文中的變量時,查找進程總是從自己的變量對象開始。如果在自己的變量對象中沒發(fā)現(xiàn)要查找的變量,繼續(xù)搜索作用域鏈。他將攀爬作用域鏈檢查每一個執(zhí)行上下文的變量對象,去尋找和變量名稱匹配的值

閱讀更多

我的博客即將搬運同步至騰訊云+社區(qū),邀請大家一同入駐:https://cloud.tencent.com/dev...

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

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

相關文章

  • 理解JavaScript中的作用作用

    摘要:示例當一個函數(shù)創(chuàng)建后,它的作用域鏈會被創(chuàng)建此函數(shù)的作用域中可訪問的數(shù)據(jù)對象填充。每一個運行期上下文都和一個作用域鏈關聯(lián)。此時,作用域鏈中函數(shù)的所有局部變量所在的作用域?qū)ο髸煌坪螅L問代價變高了。 作用域 作用域就是變量與函數(shù)的可訪問范圍,即作用域控制著變量與函數(shù)的可見性和生命周期。在JavaScript中,變量的作用域有全局作用域和局部作用域兩種。 作用域鏈 函數(shù)對象有一個內(nèi)部屬性[...

    XanaHopper 評論0 收藏0
  • 深入理解JavaScript作用作用

    前言 JavaScript中有一個被稱為作用域(Scope)的特性。雖然對于許多新手開發(fā)者來說,作用域的概念并不是很容易理解,本文我會盡我所能用最簡單的方式來解釋作用域和作用域鏈,希望大家有所收獲! 想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客 作用域(Scope) 1.什么是作用域 作用域是在運行時代碼中的某些特定部分中變量,函數(shù)和對象的可訪問性。換句話說,作用域決定了代碼區(qū)塊中變量和其他資源的可見...

    baiy 評論0 收藏0
  • 深入理解JavaScript作用作用

    前言 JavaScript中有一個被稱為作用域(Scope)的特性。雖然對于許多新手開發(fā)者來說,作用域的概念并不是很容易理解,本文我會盡我所能用最簡單的方式來解釋作用域和作用域鏈,希望大家有所收獲! 想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客 作用域(Scope) 1.什么是作用域 作用域是在運行時代碼中的某些特定部分中變量,函數(shù)和對象的可訪問性。換句話說,作用域決定了代碼區(qū)塊中變量和其他資源的可見...

    ytwman 評論0 收藏0
  • 【進階2-3期】JavaScript深入之閉包面試題解

    摘要:閉包面試題解由于作用域鏈機制的影響,閉包只能取得內(nèi)部函數(shù)的最后一個值,這引起的一個副作用就是如果內(nèi)部函數(shù)在一個循環(huán)中,那么變量的值始終為最后一個值。 (關注福利,關注本公眾號回復[資料]領取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實戰(zhàn)、面試指導) 本周正式開始前端進階的第二期,本周的主題是作用域閉包,今天是第8天。 本計劃一共28期,每期重點攻克一個面試重難點,如果你還不了...

    alanoddsoff 評論0 收藏0
  • javascript系列--javascript深入理解--作用,作用鏈,閉包的面試題解

    摘要:一概要作用域和作用域鏈是中非常重要的特性,關系到理解整個體系,閉包是對作用域的延伸,其他語言也有閉包的特性。作用域鏈的作用他保證了變量對象的有序訪問。 一、概要 作用域和作用域鏈是js中非常重要的特性,關系到理解整個js體系,閉包是對作用域的延伸,其他語言也有閉包的特性。 那什么是作用域?作用域指的是一個變量和函數(shù)的作用范圍。 1、js中函數(shù)內(nèi)聲明的所有變量在函數(shù)體內(nèi)始終是可見的; 2...

    anRui 評論0 收藏0

發(fā)表評論

0條評論

Coding01

|高級講師

TA的文章

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