JavaScript閉包(Closure)是一種在函數內部創建并返回另一個函數的技術。閉包可以讓你訪問并操作外部作用域的變量,即使外部函數已經執行完畢。閉包在JavaScript中具有很多用途,如數據隱藏、模擬私有變量和實現函數柯里化等。
以下是使用閉包的一個簡單示例:
function outer() {
let count = 0; // 這是一個外部作用域的變量
function inner() {
count++; // 在內部函數中訪問并修改外部作用域的變量
console.log(count);
}
return inner; // 返回內部函數,使其在外部作用域之外仍然可訪問
}
const incrementCounter = outer(); // 調用外部函數并獲取內部函數
incrementCounter(); // 輸出 1
incrementCounter(); // 輸出 2
在這個示例中,outer
函數返回了 inner
函數。當我們調用 outer
函數時,它返回 inner
函數的引用,而不是立即執行它。然后我們可以將這個引用賦值給 incrementCounter
變量,并在之后的代碼中調用它。由于閉包的作用,inner
函數可以訪問并修改 count
變量,即使 outer
函數已經執行完畢。
這是一個更復雜的使用閉包的示例,實現一個簡單的計數器:
function createCounter() {
let count = 0;
return {
increment: function () {
count++;
console.log(count);
},
decrement: function () {
count--;
console.log(count);
},
getCount: function () {
return count;
},
};
}
const counter = createCounter();
counter.increment(); // 輸出 1
counter.increment(); // 輸出 2
counter.decrement(); // 輸出 1
console.log(counter.getCount()); // 輸出 1
在這個示例中,我們創建了一個名為 createCounter
的函數,它返回一個包含三個方法的對象:increment
、decrement
和 getCount
。這些方法都可以訪問和修改 count
變量,但由于閉包的作用,它們在外部作用域之外仍然可以訪問它。這樣我們就可以通過調用 createCounter
函數來創建一個帶有私有變量的計數器對象。