原題鏈接:
https://leetcode.cn/problems/counter-ii/
在解決本題之前,我們首先需要了解 JavaScript 中的一個重要概念——閉包(Closure)。閉包在 JavaScript 中是一種非常強大的特性,它可以讓函數訪問并操縱函數之外的變量,即使那個外部函數已經執行結束。
在 JavaScript 中,當一個函數被創建時,它會記住自己被創建時的環境,并且可以訪問這個環境中的所有變量。這就意味著,即使一個函數已經執行完畢并且其執行環境已經消失,該函數仍然可以通過閉包來訪問和操作它被創建時的環境中的變量。
下面是一個簡單的閉包示例:
function outer() {
var outerVar = 'I am from outer function';
function inner() {
console.log(outerVar);
}
return inner;
}
var innerFunc = outer();
innerFunc(); // 輸出:I am from outer function
在這個例子中,outer
函數中定義了一個變量 outerVar
和一個函數 inner
。雖然 outer
函數在被調用后就已經執行結束,但由于閉包的存在,我們通過 innerFunc
仍然可以訪問 outerVar
這個變量。
現在我們用這個閉包的概念來解決本題:
/**
* @param {integer} init
* @return { increment: Function, decrement: Function, reset: Function }
*/
var createCounter = function(init) {
// 定義一個變量 count 來存儲當前的計數值,初始值為 init
let count = init;
// 返回一個對象,包含 increment、decrement 和 reset 三個方法
return {
// increment 方法將 count 值加 1,然后返回新的 count 值
increment() {
return ++count;
},
// decrement 方法將 count 值減 1,然后返回新的 count 值
decrement() {
return --count;
},
// reset 方法將 count 值重置為初始值 init,然后返回新的 count 值
reset() {
return (count = init);
},
};
};
/**
* 使用示例:
* const counter = createCounter(5);
* console.log(counter.increment()); // 輸出:6
* console.log(counter.reset()); // 輸出:5
* console.log(counter.decrement()); // 輸出:4
*/
在這個解法中,我們創建了一個閉包,使得 increment
、decrement
和 reset
這三個函數都能夠訪問和操作 count
變量。雖然 createCounter
函數在被調用后就已經執行結束,但由于閉包的存在,我們創建的這三個函數仍然可以訪問和操作 count
變量。這就是 JavaScript 閉包的強大之處。通過閉包,我們可以創建出具有“記憶”功能的函數,這些函數可以記住并操作它們被創建時所在的環境中的變量。