#2620:计数器
#javascript #算法 #leetcode

再次回到30 Days挑战中的第二个问题,#2620。

过程

说明如下。

给定整数n,返回counter函数。此counter函数最初返回n,然后返回1比以前的值返回1个后续值(nn + 1n + 2等)。

如果您对返回值感到好奇,这是单元测试。

/** 
 * const counter = createCounter(10)
 * counter() // 10
 * counter() // 11
 * counter() // 12
 */

欢迎使用一个重要的JS概念,称为封闭。说我们有以下功能。

function outerFunction() {
  let outerVariable = 'I am outside!';

  function innerFunction() {
    console.log(outerVariable);
  }

  return innerFunction;
}

let closure = outerFunction();
closure(); // Outputs: "I am outside!"

这是关键概念 - 即使该功能完成了执行,我们仍然能够访问outerVariable变量。这意味着要解决此问题,这比创建一个私有计数器变量并每次调用函数时都更难。

让我们编写一些代码。

function createCounter(n) {
  let i = -1;
  return function() {
    i++;
    return n + i;
  };
}

这是我原始的解决方案 - 但是我回顾一下它,意识到它很混乱。让我们尝试简化。

第一件事 - 我们不需要i++n + i是单独的位。我忘记了i++不仅会增加i-还返回旧值(如果您想要新值,请使用++i)。因此,让我们更改并添加一些箭头语法。

function createCounter(n) {
  let i = 0;
  return () => n + i++;
}

请注意,我将i的初始值从-1更改为0。这是因为我们最初必须增加然后返回数字 - 首次必须是n,因此我们将i设置为-1我们第一次将函数称为n而不是n + 1。使用i++,它将第一次返回n - 因此,如果我们在-1保持i,我们将获得n-1,这是不是 我们想要的结果。

结论

有了封闭知识,这并不难。这个概念是一个不断挑战的概念,因此请确保您在继续前进之前就摇摇欲坠。

如果您发现这个有用,请务必在帖子上留下ð,而在Github repo!

上留下一个ð

关注更多LC内容:)