JavaScript闭包-计数调用

时间:2019-11-16 18:51:33

标签: javascript

我正在学习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)而不是字符串。为什么仍然存在错误?

1 个答案:

答案 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)中,您需要重新分配下一个值以对变量进行计数并返回其值。