js原理 閉包(理解閉包要先從基礎知識開始)

2021-10-19 14:32:35 字數 1360 閱讀 1217

序:很多人在面試被問到閉包時,都是回答閉包就是函式包著函式,閉包裡的變數不會被銷毀而云云等等。並且有很常多初學者都困惑為什麼經常被問閉包?好像工作中也不常用到啊。其實問閉包就是要考你的基礎扎不紮實,閉包也經常會用到,只是現在很多框架都封裝好了,不需要我們直接去建閉包函式了。

執行環境(execution context),又稱執行上下文,(js高階程式設計書中也稱為作用域),指變數或函式執行操作的區域(執行環境定義了變數或函式有權訪問的其他資料,決定了它們各自的行為。每個執行環境都有乙個與之關聯的變數物件(variable object),環境中定義的所有變數和函式都儲存在這個物件中。雖然我們編寫的**無法訪問這個物件,但解析器在處理資料時會在後台使用它。),分為全域性執行環境(window)和函式擁有的區域性執行環境。

執行流:從全域性執行環境開始,向各個層級的區域性執行環境中流去,每流向乙個執行環境中就驅動此執行環境的操作(當執行流進入乙個函式時,函式的環境就會被推入乙個環境棧中。而在函式執行之後,棧將其環境彈出,把控制權返回給之前的執行環境),也象徵著程式的執行順序。

作用域鏈(scope chain):規定了對執行環境中的所有變數和函式有序訪問的順序鏈,此鏈的開端就是當前執行環境,逐層向外層延伸,末端是全域性執行環境。識別符號的搜尋永遠都是從作用域鏈的開端到末端。

此處有乙個重要的設計特點:內部環境可以通過作用域鏈訪問所有的外部環境,但外部環境不能訪問內部環境中的任何變數和函式

於是閉包就出場了,閉包就是將外部執行環境和內部執行環境連線起來的一座橋梁,可以通過閉包建立用於訪問內部執行環境變數(私有變數)的特權方法。

閉包的常見方式,就是在乙個函式內部建立另乙個函式

● settimeout 傳參

● 模範塊作用域

● 不暴露出去的私有變數和特權方法

每個執行環境都有乙個表示變數的物件——變數物件,作用域鏈本質上是乙個指向變數物件的指標列表,它只引用但不實際包含變數物件。

通常,當函式執行完畢後,函式區域性的變數物件和作用域鏈就會被銷毀,記憶體中僅儲存全域性作用域(全域性執行環境的變數物件)。

閉包的情況是:外部函式執行完後,返回了乙個匿名函式。此時外部函式的作用域鏈被銷毀了,但是匿名函式的作用域鏈仍然在引用外部的變數物件。所以外部的變數物件會存在記憶體中,直到匿名函式被銷毀,它才會被銷毀。

**記憶體的方法是:將此閉包的使用變數設為null,例如:

functionbb(

)}let use =bb(

)// ...... 使用過程

// 使用完後

use =

null

根據以上思路分析和回答閉包的面試題是不是有機會脫穎而出呢?如果我有幫助到你,希望可以 三連支援下。

JS閉包理解

下圖例項 body ul li 1 li li 2 li li 3 li ul body html script vara document.getelementsbytagname li for vari 0 i a.length i i 如何從外部讀取區域性變數 functionvisitinn...

JS閉包理解

js閉包理解 在很多面試題中都會問什麼是js的閉包,為什麼需要使用閉包,使用閉包的優缺點!我在面試其他人的時候也喜歡問這個問題,回答的也是千奇百怪,現在就總結一下我對閉包的理解。閉包是一種概念,這種概念比較複雜,很多地方的定義不盡相同,我的理解是 閉包是能讀取函式內部變數的函式,也就是定義在函式內部...

js閉包理解

什麼是閉包?這兩天我在網上翻閱了大量的閉包理解部落格,有優秀的也有生搬硬套的。歸根揭底,還是理解的問題。我曾經聽老師講閉包後,還是一臉疑惑,然後下課去網上查閱資料,仔細研究之後知道是裡面要套乙個函式返回父級變數。這次我就講解一下個人理解的閉包。為什麼會出現閉包?首先,我們先想下,我現在需要乙個一直用...