再次回到30 Days挑战中的第二个问题,#2620。
过程
说明如下。
给定整数
n
,返回counter
函数。此counter
函数最初返回n
,然后返回1比以前的值返回1个后续值(n
,n + 1
,n + 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内容:)