Js中的閉包原理

2022-03-16 11:37:56 字數 1700 閱讀 2815

要了解清楚js中的閉包制機,那麼得先了解全域性執行環境、塊級執行環境、函式執行環境、變數物件、環境棧、作用域鏈、摧毀執行環境。

全域性執行環境

全域性執行環境指的是最外層的執行環境。在web中全域性執行環境被認為

window

物件,所以你在全域性環境中建立的變數與函式都是物件的屬性和方法。

函式執行環境

函式執行環境指的是函式體。

塊級執行環境

塊級執行環境指的是塊級定義區域。

'use strict';

// 全域性執行環境

// .....

function func()

變數物件每乙個執行環境最有乙個與之關聯的變數物件,變數物件中儲存當前環境中定義的變數與函式。在使用變數或函式時,都是在個變數物件上去尋找成員的。這個物件是無法訪問的,但是你可以在作用域鏈[scope]中檢視到所定義的成員(如果沒有使用的話可能無法看到,這和優化有關)。

環境棧

每個函式或塊都有自己的執行環境。當執行流進入乙個函式時,函式的環境就會被推入「環境棧」中。函式執行完後,棧將其彈出並銷毀變數物件,然後把控制權返回在給之前的執行環境。如果內執行環境的變數物件,被外部執行環境引用,那麼內部環境變數物件就無法被銷毀(如:閉包)。

作用域鏈

作用域鏈是乙個列表,儲存著與執行環境相關的變數物件,通過【scope】屬性可檢視變數物件列表。

關係圖

例項講解

// 例子

1:常見的函式巢狀

'use strict';

function a()

}let func = a(); // 返回a函式體內的 匿名函式

console.log(func()); // 在全域性執行環境中,訪問a函式內部變數。 如果是非閉包函式,那麼執行完後

我們來看一下,a函式體內匿名函式的作用域鏈。

[scopes] : 是當前匿名函式的作用域鏈。

索引為 0 的:是

a函式的執行環境的變數物件,

x 表示 變數物件中的。

索引為 1 的:全域性執行環境變數物件。

// 例子

2:訪問塊內部變數

1:返回塊級內容函式 實現在全域性執行環境中訪問塊級內容變數。

'use strict';

let func = null;

}// 返回塊級內容函式 實現在全域性執行環境中訪問塊級內容變數。

console.log(func());

作用域煉圖:

JS閉包原理分析

js閉包原理分析 閉包是指有權訪問另乙個函式作用域中的變數的函式。在乙個函式a內部返回另乙個函式b,並且函式b裡面使用者a函式內部的私有變數,此外在函式a外面定義乙個變數接收函式b,這樣就形成了閉包。比如在一棟房子裡面有很多個小房間,你手上通過拿著乙個小房間的位址 棟001房 那麼通過小房間的位址就...

js閉包函式原理

變數作用域 全域性變數和區域性變數 問題 函式外部無法讀取內部 宣告也會體現是否全域性在函式內或者外部 1.閉包 就是指能夠讀取其他函式內部變數的函式。在js中,只有函式內部的子函式才能讀取區域性變數,所以閉包可以理解成 定義在乙個函式內部的函式 巢狀函式 本質上,閉包是將函式內部和外部連線起來的橋...

JS 閉包的實現原理

函式都有自己的執行環境,該環境定義了變數或者函式訪問資料的許可權,當離開執行環境後,該環境內的變數會被銷毀。function add console.log a referenceerror a is not defined 上例a在 add 函式的作用域內,能夠訪問,離開作用域後,就無法訪問了。那...