什麼是閉包?閉包的作用是什麼?

huangpb0624發表於2019-10-21

閉包的定義

《JavaScript高階程式設計》:

閉包是指有權訪問另一個函式作用域中的變數的函式

《JavaScript權威指南》:

從技術的角度講,所有的JavaScript函式都是閉包:它們都是物件,它們都關聯到作用域鏈。

《你不知道的JavaScript》

當函式可以記住並訪問所在的詞法作用域時,就產生了閉包,即使函式是在當前詞法作用域之外執行。

自己的解釋:一個內部函式,有權訪問包含其的外部函式中的變數,就形成了閉包。

建立一個閉包

function foo() {
    var a = 2;
    return function fn() {
        console.log(a);
    }
}
let func = foo();
func(); //輸出2

閉包使得函式可以繼續訪問定義時的詞法作用域。拜 fn 所賜,在 foo() 執行後,foo 內部作用域不會被銷燬。

閉包的作用

1. 能夠訪問函式定義時所在的詞法作用域(阻止其被回收)。

2. 私有化變數

function base() {
    let x = 10; //私有變數
    return {
        getX: function() {
            return x;
        }
    }
}
let obj = base();
console.log(obj.getX()); //10

3. 模擬塊級作用域

var a = [];
for (var i = 0; i < 10; i++) {
    a[i] = (function(j){
        return function () {
            console.log(j);
        }
    })(i);
}
a[6](); // 6

4. 建立模組

function coolModule() {
    let name = 'Yvette';
    let age = 20;
    function sayName() {
        console.log(name);
    }
    function sayAge() {
        console.log(age);
    }
    return {
        sayName,
        sayAge
    }
}
let info = coolModule();
info.sayName(); //'Yvette'

模組模式具有兩個必備的條件

  • 必須有外部的封閉函式,該函式必須至少被呼叫一次(每次呼叫都會建立一個新的模組例項)
  • 封閉函式必須返回至少一個內部函式,這樣內部函式才能在私有作用域中形成閉包,並且可以訪問或者修改私有的狀態。

閉包的缺陷

  • 常駐記憶體會增大記憶體使用量,使用不當很容易造成記憶體洩露。

  • 如果不是因為某些特殊任務而需要閉包,在沒有必要的情況下,在其它函式中建立函式是不明智的,因為閉包對指令碼效能具有負面影響,包括處理速度和記憶體消耗。

 

 

 

 

 

相關文章