LeetCode題解:2665. 計數器 II

原題鏈接:
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
 */

在這個解法中,我們創建了一個閉包,使得 incrementdecrementreset 這三個函數都能夠訪問和操作 count 變量。雖然 createCounter 函數在被調用后就已經執行結束,但由于閉包的存在,我們創建的這三個函數仍然可以訪問和操作 count 變量。這就是 JavaScript 閉包的強大之處。通過閉包,我們可以創建出具有“記憶”功能的函數,這些函數可以記住并操作它們被創建時所在的環境中的變量。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容