JavaScript閉包是一種有趣的編程特性,它允許函數訪問其外部環境中定義的變量和函數。閉包的常見應用包括:保存特定狀態、模擬私有變量和封裝代碼片段。
在閉包中,參數扮演著重要的角色。當一個函數在定義時引用了參數,閉包通過引用這些參數來“記住”函數被調用時的特定狀態。
function createCounter(start) { return function() { return start++; } } const counter1 = createCounter(1); const counter2 = createCounter(10); console.log(counter1()); // 輸出 1 console.log(counter1()); // 輸出 2 console.log(counter2()); // 輸出 10 console.log(counter1()); // 輸出 3 console.log(counter2()); // 輸出 11
在上面的例子中,我們定義了一個稱為 createCounter 的函數,它接受一個 start 參數。當調用 createCounter 時,它返回一個新的函數,該函數通過閉包記住了 start 的值。我們創建了兩個計數器,一個從 1 開始,一個從 10 開始。每次調用計數器的函數時,由于閉包記住了計數器的當前狀態,它會返回下一個數字。
除了記住參數的值,閉包還可以引用周圍的變量。
function createAdder(x) { function add(y) { return x + y; } return add; } const addFive = createAdder(5); console.log(addFive(3)); // 輸出 8
在這個例子中,我們使用 createAdder 函數創建了一個返回函數的閉包。返回的函數 add 引用了 createAdder 的 x 參數,因此閉包記住了 x 值并使用它計算返回值。
閉包可用于隱藏實現細節并創建私有變量。一個常見的模式是將私有變量作為閉包范圍內的變量定義,然后將公共接口作為閉包返回函數。這種方法被稱為模塊模式。
const counter = (function() { let count = 0; return { increment: function() { count++; }, decrement: function() { count--; }, getCount: function() { return count; } }; })(); console.log(counter.getCount()); // 輸出 0 counter.increment(); console.log(counter.getCount()); // 輸出 1 counter.decrement(); console.log(counter.getCount()); // 輸出 0
在這個例子中,我們定義了一個使用立即執行函數創建的閉包。匿名函數定義了變量 count 和三個返回函數,將每個函數作為公共接口返回。因為 count 是閉包內的變量,返回函數可以訪問和更改它,但外部代碼不能。
總而言之,閉包是一種強大而靈活的編程模式,可以使我們在JavaScript中實現一些非常有趣的功能。當我們使用參數時,閉包可以記住和重復特定的狀態。通過它們,我們可以隱藏實現和創建私有數據,使我們的代碼更安全、更干凈。