JavaScript 閉包(Closure)

JavaScript 中的閉包(Closure)是指一種函數和其相關的引用環境的組合。當一個函數可以訪問其定義時所處的詞法作用域中的變量,即使在函數被調用時,這些變量已經不再存在,那麼這個函數就被稱為閉包。

閉包的作用是可以訪問外部函數的變量和參數,同時也可以訪問全局變量。閉包可以用於許多場景,比如實現模塊化、延遲執行、實現私有變量和方法、避免全局污染等。

在 JavaScript 中,當一個函數返回另一個函數時,後者可以訪問前者的變量,即使前者已經執行完畢並且其執行上下文已經被銷毀。這個後者就是一個閉包。

以下是一個使用閉包實現計數器的例子:

function createCounter() {

  let count = 0;

  return function() {

    count++;

    console.log(count);

  }

}



const counter = createCounter();

counter(); // output 1

counter(); // output 2

counter(); // output 3

在上面的例子中,createCounter 函數返回一個內部函數,這個內部函數訪問了 createCounter 的作用域中的變量 count,並且每次被調用時都將 count 的值加 1 並輸出。由於 counter 函數是 createCounter 的返回值,所以它是一個閉包,可以訪問 createCounter 的作用域中的變量 count,並且每次執行時都能正確地記錄 count 的值。

閉包的特性包括:

  1. 可以訪問定義時所在的詞法作用域。

  2. 可以在函數外部訪問閉包內部的變量。

  3. 閉包中的變量會常駐內存,不會被垃圾回收機制回收,因此需要注意內存洩漏的問題。

總的來說,閉包是 JavaScript 中非常重要的概念,它可以用來創建模塊、實現私有變量和方法、避免全局污染等。在使用閉包時,需要注意內存洩漏的問題,避免造成不必要的性能問題。