我正在学习JS封闭概念。我陷入了练习的第二部分。
这是问题:
第1部分: 编写一条语句,该语句在执行时绑定变量inc 转换为采用数字(x)并返回该数字x + 1的函数。
第2部分:
创建一个新文件counter.js,该文件将导出up
,而无需 参数,并且在第一次调用时返回1;在第二个 调用,返回2;并且通常在第n次调用返回 。此函数不应直接使用任何算术运算符,而应 应使用inc。
我对第1部分的回答:
// inc.js
function plusOne(x){
return x+1;
}
module.exports.plusOne = plusOne;
我对第2部分的回答:
let inc = require('./inc.js')
function makeCounter(){
let count = 0;
return inc.plusOne(count);
};
let counter = makeCounter;
console.log( counter() ); // should execute 0
console.log( counter() ); // should execute 1
console.log( counter() ); // should execute 2
我对第2部分的回答显然是不对的,因为我对所有3张照片都获得了“ 1”。
对于相同的功能,我还有一个其他问题(我不确定在这里添加它还是将其添加到我问的另一个问题中)- 在第2部分中,更改
let counter = makeCounter;
到
let counter = makeCounter();
将产生错误。我将此作为单独的问题here发布。但是我对第2部分的回答是makeCounter()确实返回了一个函数inc.plusOne(count)
而不是字符串。为什么仍然存在错误?
答案 0 :(得分:0)
正如乔治所说,您的makeCounter
函数应通过返回一个在其闭包中使变量count
发生突变的函数来创建一个闭包。这使得count
在函数调用之间存储其值。看起来像这样:
function inc(x) {
return x + 1;
}
function makeCounter() {
let count = 0;
return function callsCounter() {
count = inc(count);
return count;
}
}
const myCounter = makeCounter()
console.log(myCounter())
console.log(myCounter())
console.log(myCounter())
在每次调用返回函数(在我的情况下为callsCounter
)中,您需要重新分配下一个值以对变量进行计数并返回其值。