搜尋
首頁web前端前端問答JavaScript底層原理之作用域鏈(圖文詳解)

本篇文章為大家帶來了JavaScript中作用域鏈的相關知識,外部空間不能存取內部變量,我們往往只知道這一基本規則,那實現這一基本規則的基本底層原理是什麼呢?希望能給大家一些幫助!

JavaScript底層原理之作用域鏈(圖文詳解)

作用域

1.什麼是作用域

簡單來說,作用域(英文:scope)是據名稱來找出變數的一套規則,可以把作用域通俗理解為一個封閉的空間,這個空間是封閉的,不會對外部產生影響,外部空間不能存取內部空間,但是內部空間可以存取將其包裹在內的外部空間。

2.[[Scopes]]屬性

在javascript中,每個函數都是一個對象,在物件中有些屬性我們可以訪問,有些我們是不能自由訪問的,[[Scopes]]屬性就是其中之一,這個屬性只能被JavaScript引擎讀取。

其實[[scope]]就是我們常說的作用域,其中儲存了作用域運作期的上下文集合。

在這裡因為func.prototype.constructor和func指向同一個函數,所以在這裡我們透過存取函數func的原型物件來查看[[Scopes]]屬性

JavaScript底層原理之作用域鏈(圖文詳解)

#3.作用域鏈

[[scope]]中儲存的執行期的上下文物件的集合,這個集合呈現鍊式連接,我們把這種鍊式連接叫做作用域鏈。 JavaScript正是透過作用域鏈來找出變數的,其尋找方式是沿著作用域鏈的頂端依序向下查詢(在哪個函數內部尋找對象,就在哪個函數作用域鏈中尋找)

#4.圖解找出變數原理

//以如下代码为例说明JavaScript通过作用域链查找变量的原理**
function a() {
  function b() {
      var b = 123;
  }
  var a = 123;
  b();
}
var glob = 100;

#1.當全域函數a()被定義時,作用域鏈如下

JavaScript底層原理之作用域鏈(圖文詳解)

    函數的[[Scopes]]屬性指向作用域鏈對象,此時作用域鏈只有一個鍵值對,這個鍵值對指向全域對象,全域對象儲存了全域下可以存取的東西,也就是最外層作用域,大家都可以存取的。

2.當全域函數a()被啟動呼叫時,作用域鏈如下

JavaScript底層原理之作用域鏈(圖文詳解)

此時作用域鏈能夠第一個存取的是Activation Object中的鍵值對,如果沒有才存取全域物件

3.函數a()中函數b被定義時,b的作用域鏈如下

JavaScript底層原理之作用域鏈(圖文詳解)

當b只是被定義沒有被呼叫時,b的作用域鍊和a是相同的

4.當函數a()中的函數b被啟動呼叫時,作用域鏈如下

JavaScript底層原理之作用域鏈(圖文詳解)

作用域鏈最先指向函數b()的Activation Object,查找變數也是按作用域鏈順序訪問,找到就停止

5.總結

之所以外部作用域不能存取內部作用域的原因是外部作用域的作用域鏈沒有內部作用域的Activation Object,所以無法存取內部變量,內部作用域存取變數的順序是依照作用域鏈,先從裡面查找,沒有就沿著作用域鏈向外找,外部是全域作用域

相關推薦:javascript學習教學
##

以上是JavaScript底層原理之作用域鏈(圖文詳解)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:掘金。如有侵權,請聯絡admin@php.cn刪除
React的SEO友好性:提高搜索引擎可見性React的SEO友好性:提高搜索引擎可見性Apr 26, 2025 am 12:27 AM

是的,ReactApplicationsCanbEseo-FrylylywithProperStratecies.1)用戶 - 插圖(SSR)withToolslikenext.jstogenate.jstogenate fullhtmlforindexing.2)enasleStaticsiteSitegeneration(ssg)

React的性能瓶頸:識別和優化緩慢的組件React的性能瓶頸:識別和優化緩慢的組件Apr 26, 2025 am 12:25 AM

React性能瓶颈主要由低效渲染、不必要的重渲染和组件内重的计算造成。1)使用ReactDevTools定位慢组件并应用React.memo优化。2)优化useEffect,确保仅在必要时运行。3)使用useMemo和useCallback进行记忆化处理。4)将大组件拆分为小组件。5)对于大数据列表,使用虚拟滚动技术优化渲染。通过这些方法,可以显著提升React应用的性能。

反應的替代方案:探索其他JavaScript UI庫和框架反應的替代方案:探索其他JavaScript UI庫和框架Apr 26, 2025 am 12:24 AM

有人可能會尋找React的替代品,因為性能問題、學習曲線或探索不同的UI開發方法。 1)Vue.js因其易於集成和溫和的學習曲線而受到讚揚,適用於小型和大型應用。 2)Angular由Google開發,適合大型應用,具有強大的類型系統和依賴注入。 3)Svelte通過在構建時編譯成高效的JavaScript,提供出色的性能和簡潔性,但其生態系統仍在成長。選擇替代品時,應根據項目需求、團隊經驗和項目規模來決定。

鑰匙與React的和解算法:提高性能鑰匙與React的和解算法:提高性能Apr 26, 2025 am 12:21 AM

KeysinReactarespecialattributesassignedtoelementsinarraysforstableidentity,crucialforthereconciliationalgorithmwhichupdatestheDOMefficiently.1)KeyshelpReacttrackchanges,additions,orremovalsinlists.2)Usingunique,stablekeyslikeIDsratherthanindicespreve

React項目所需的樣板代碼:減少設置開銷React項目所需的樣板代碼:減少設置開銷Apr 26, 2025 am 12:19 AM

toreCesetUpoverHeadInreActProjects,UsetoolslikecreateActApp(CRA),Next.js,Gatsby,orstarterkits和ManaintainamodullStructur e.1)crasimplifiessetupwithasinglecommand.2)next.jsandgatsbymorefermorefeaturesbutarearningcurve.3)starterkitsprovidecomprehensi

了解usestate():綜合反應國家管理指南了解usestate():綜合反應國家管理指南Apr 25, 2025 am 12:21 AM

useState()isaReacthookusedtomanagestateinfunctionalcomponents.1)Itinitializesandupdatesstate,2)shouldbecalledatthetoplevelofcomponents,3)canleadto'stalestate'ifnotusedcorrectly,and4)performancecanbeoptimizedusinguseCallbackandproperstateupdates.

使用React的優點是什麼?使用React的優點是什麼?Apr 25, 2025 am 12:16 AM

ReactispupularduetoItsOmpontement,基於虛擬,虛擬詞,Richecosystem和declarativedation.1)基於組件的harchitectureallowslowsforreusableuipieces。

在React中調試:識別和解決共同問題在React中調試:識別和解決共同問題Apr 25, 2025 am 12:09 AM

todebugreactapplicationsefectefectionfection,usethestertate:1)proppropdrillingwithcontextapiorredux.2)使用babortControllerToptopRollerTopRollerTopRollerTopRollerTopRollerTopRollerTopRollerTopRollerTopRollerTopRaceeDitions.3)intleleassynChronOusOperations.3)

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具