摘要:一旦函數執行完成,其就會從作用域鏈頂部移除,并且執行權會返回到函數。攀爬作用域鏈當不同執行上下文之間存在變量命名沖突,可以通過攀爬作用域鏈解決從頂部到底部。
一、作用域
在 JavaScript 中, 作用域(scope,或譯有效范圍)就是變量和函數的可訪問范圍,即作用域控制著變量和函數的可見性和生命周期二、全局/局部作用域 2.1 全局作用域(Global Scope)
(1)不在任何函數內定義的變量就具有全局作用域。
(2)實際上,JavaScript默認有一個全局對象window,全局作用域的變量實際上被綁定到window的一個屬性。
(3)window對象的內置屬性都擁有全局作用域,例如 window.name、window.location、window.top 等。
2.2 局部作用域(Local Scope)(1)JavaScript的作用域是通過函數來定義的,在一個函數中定義的變量只對這個函數內部可見,稱為函數(局部)作用域。
三、全局/局部變量變量能夠被定義在局部或者全局作用域,這導致運行時變量的訪問來自不同的作用域。3.1 全局變量
(1)在函數定義外聲明的變量是全局變量。
(2)全局變量有 全局作用域,它的值可在整個程序中訪問和修改。
(3)如果變量在函數內沒有聲明(沒有使用 var 關鍵字),該變量為全局變量。
3.2 局部變量(1)在函數定義內聲明的變量是局部變量。
(2)因為局部變量只作用于函數內,所以不同的函數可以使用相同名稱的變量。
(3)每當執行函數時,都會創建和銷毀該變量,且無法通過函數之外的任何代碼訪問該變量。
(4)函數外無法訪問函數內的變量,函數內卻可以訪問函數外的變量。
四、全局變量1、在函數定義外聲明的變量是全局變量;全局變量有全局作用域,它的值可在整個程序中訪問和修改。
2、如果變量在函數內沒有聲明(沒有使用 var 關鍵字),該變量為全局變量。五、局部變量
1、因為局部變量只作用于函數內,所以不同的函數可以使用相同名稱的變量。
2、每當執行函數時,都會創建和銷毀該變量,且無法通過函數之外的任何代碼訪問該變量。
3、函數外無法訪問函數內的變量,函數內卻可以訪問函數外的變量。六、塊級作用域 6.1 概念
塊級作用域指在If語句,switch語句,循環語句等語句塊中定義變量,這意味著變量不能在語句塊之外被訪問。6.2 var 不支持塊級作用域
(1)在If等語句塊中,定義的變量從屬于該塊所在的作用域,和函數不同,他們不會創建新的作用域。
6.3 let和const(1)為了解決塊級作用域,ES6引入了 let 和 const 關鍵字,可以聲明一個塊級作用域的變量。
(2)全局作用域的生存周期與上述應用相同。局部作用域只在該函數調用執行期間存在。
七、上下文 vs 作用域(1)首先需要說明的是上下文和作用域是不同的概念。
(2)每個函數調用都有與之相關的作用域和上下文。從根本上說,作用域是基于函數,而上下文是基于對象。
(3)作用域是和每次函數調用時變量的訪問有關,并且每次調用都是獨立的。上下文總是關鍵字 this 的值,是調用當前可執行代碼的對象的引用。
八、“this” 上下文(1)上下文通常是取決于一個函數如何被調用。當函數作為對象的方法被調用時,this 指向調用方法的對象。
(2)當調用一個函數時,通過 new 操作符創建一個對象的實例,當以這種方式調用時,this 指向新創建的實例。
(3)當調用一個未綁定函數,this 默認指向全局上下文或者瀏覽器中的window對象。然而如果函數在嚴格模式下被執行(“use strict”),this 默認指向 undefined。
九、執行上下文(1)當函數執行時,會創建一個稱為執行上下文的內部對象(可理解為作用域,不是前面討論的上下文)。一個執行上下文定義了一個函數執行時的環境。
(2)函數每次執行時對應的執行上下文都是獨一無二的,所以多次調用一個函數會導致創建多個執行上下文。
(3)當javascript代碼文件被瀏覽器載入后,默認最先進入的是一個全局的執行上下文。當在全局上下文中調用執行一個函數時,程序流就進入該被調用函數內,此時引擎就會為該函數創建一個新的執行上下文,并且將其壓入到執行棧頂部(作用域鏈)。瀏覽器總是執行位于執行棧頂部的當前執行上下文,一旦執行完畢,該執行上下文就會從執行棧頂部彈出,并且控制權將進入其下的執行上下文。這樣,執行棧中的執行上下文就會被依次執行并且彈出,直到回到全局的執行上下文。
十、作用域鏈(1)在JavaScript中,函數也是對象,對象中有些屬性我們可以訪問,但有些不可以(訪問),這些屬性僅供JavaScript引擎存取,[[scope]]就是其中一個。
(2)[[scope]]指的就是我們所說的作用域,其中存儲了執行上下文的集合。
(3)[[scope]]中所存儲的執行上下文對象的集合,這個集合呈鏈式鏈接,我們把這種鏈式鏈接叫做作用域鏈。
10.1 示例(1)運行示例代碼將會導致嵌套的函數被從上倒下執行,一直到 fourth 函數,此時作用域鏈從上到下為: fourth, third, second, first, global。
(2)fourth 函數能夠訪問全局變量和任何定義在first,second和third函數中的變量(和訪問自己的變量一樣)。
(3)一旦fourth函數執行完成,其就會從作用域鏈頂部移除,并且執行權會返回到third函數。這個過程一直持續到所有代碼完成執行。
10.2 攀爬作用域鏈(1)當不同執行上下文之間存在 變量命名沖突,可以通過攀爬作用域鏈解決(從頂部到底部)。這也就是說
在最內層函數(執行棧頂部的執行上下文)中,具有相同變量名稱的變量將具有較高優先級。
(2)簡單的說,每次試圖訪問函數執行上下文中的變量時,查找進程總是從自己的變量對象開始。如果在自己的變量對象中沒發現要查找的變量,繼續搜索作用域鏈。他將攀爬作用域鏈檢查每一個執行上下文的變量對象,去尋找和變量名稱匹配的值。
閱讀更多
我的博客即將搬運同步至騰訊云+社區,邀請大家一同入駐:https://cloud.tencent.com/dev...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95008.html
摘要:示例當一個函數創建后,它的作用域鏈會被創建此函數的作用域中可訪問的數據對象填充。每一個運行期上下文都和一個作用域鏈關聯。此時,作用域鏈中函數的所有局部變量所在的作用域對象會被推后,訪問代價變高了。 作用域 作用域就是變量與函數的可訪問范圍,即作用域控制著變量與函數的可見性和生命周期。在JavaScript中,變量的作用域有全局作用域和局部作用域兩種。 作用域鏈 函數對象有一個內部屬性[...
前言 JavaScript中有一個被稱為作用域(Scope)的特性。雖然對于許多新手開發者來說,作用域的概念并不是很容易理解,本文我會盡我所能用最簡單的方式來解釋作用域和作用域鏈,希望大家有所收獲! 想閱讀更多優質文章請猛戳GitHub博客 作用域(Scope) 1.什么是作用域 作用域是在運行時代碼中的某些特定部分中變量,函數和對象的可訪問性。換句話說,作用域決定了代碼區塊中變量和其他資源的可見...
前言 JavaScript中有一個被稱為作用域(Scope)的特性。雖然對于許多新手開發者來說,作用域的概念并不是很容易理解,本文我會盡我所能用最簡單的方式來解釋作用域和作用域鏈,希望大家有所收獲! 想閱讀更多優質文章請猛戳GitHub博客 作用域(Scope) 1.什么是作用域 作用域是在運行時代碼中的某些特定部分中變量,函數和對象的可訪問性。換句話說,作用域決定了代碼區塊中變量和其他資源的可見...
摘要:閉包面試題解由于作用域鏈機制的影響,閉包只能取得內部函數的最后一個值,這引起的一個副作用就是如果內部函數在一個循環中,那么變量的值始終為最后一個值。 (關注福利,關注本公眾號回復[資料]領取優質前端視頻,包括Vue、React、Node源碼和實戰、面試指導) 本周正式開始前端進階的第二期,本周的主題是作用域閉包,今天是第8天。 本計劃一共28期,每期重點攻克一個面試重難點,如果你還不了...
摘要:一概要作用域和作用域鏈是中非常重要的特性,關系到理解整個體系,閉包是對作用域的延伸,其他語言也有閉包的特性。作用域鏈的作用他保證了變量對象的有序訪問。 一、概要 作用域和作用域鏈是js中非常重要的特性,關系到理解整個js體系,閉包是對作用域的延伸,其他語言也有閉包的特性。 那什么是作用域?作用域指的是一個變量和函數的作用范圍。 1、js中函數內聲明的所有變量在函數體內始終是可見的; 2...
閱讀 3486·2021-11-12 10:36
閱讀 2857·2021-09-22 15:35
閱讀 2807·2021-09-04 16:41
閱讀 1164·2019-08-30 15:55
閱讀 3574·2019-08-29 18:43
閱讀 2070·2019-08-23 18:24
閱讀 1412·2019-08-23 18:10
閱讀 1922·2019-08-23 11:31