要了解清楚js中的閉包制機,那麼得先了解全域性執行環境、塊級執行環境、函式執行環境、變數物件、環境棧、作用域鏈、摧毀執行環境。
全域性執行環境
全域性執行環境指的是最外層的執行環境。在web中全域性執行環境被認為
window
物件,所以你在全域性環境中建立的變數與函式都是物件的屬性和方法。
函式執行環境
函式執行環境指的是函式體。
塊級執行環境
塊級執行環境指的是塊級定義區域。
'use strict';變數物件每乙個執行環境最有乙個與之關聯的變數物件,變數物件中儲存當前環境中定義的變數與函式。在使用變數或函式時,都是在個變數物件上去尋找成員的。這個物件是無法訪問的,但是你可以在作用域鏈[scope]中檢視到所定義的成員(如果沒有使用的話可能無法看到,這和優化有關)。// 全域性執行環境
// .....
function func()
環境棧
每個函式或塊都有自己的執行環境。當執行流進入乙個函式時,函式的環境就會被推入「環境棧」中。函式執行完後,棧將其彈出並銷毀變數物件,然後把控制權返回在給之前的執行環境。如果內執行環境的變數物件,被外部執行環境引用,那麼內部環境變數物件就無法被銷毀(如:閉包)。
作用域鏈
作用域鏈是乙個列表,儲存著與執行環境相關的變數物件,通過【scope】屬性可檢視變數物件列表。
關係圖
例項講解
// 例子
1:常見的函式巢狀
'use strict';我們來看一下,a函式體內匿名函式的作用域鏈。function a()
}let func = a(); // 返回a函式體內的 匿名函式
console.log(func()); // 在全域性執行環境中,訪問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 函式的作用域內,能夠訪問,離開作用域後,就無法訪問了。那...