setInterval中的关闭计数器

时间:2018-07-19 14:01:44

标签: javascript closures setinterval

我有一个功能:

setInterval(function () {
        var counter = 0;
        (function() {
          counter = counter + 1;
          console.log(counter);
          })(counter)
       }, 1000)

为什么不增加计数器? (相反,它记录为1)。如何使它记录升序? (1,2,3,....)

3 个答案:

答案 0 :(得分:5)

您可以使用一个函数,该函数返回一个函数作为计数器的闭包。

setInterval(function(counter) {
    return function() {
        console.log(++counter);
    };
}(0), 1000);

答案 1 :(得分:4)

  1. 您正在将参数传递给您的匿名函数,但没有将该参数分配给变量。您忘记将参数放入函数定义中。
  2. 您将在每次迭代中创建新变量,而不是在它们之间共享变量。您需要将逻辑从内到外。

(function(closed_over_counter) {

  setInterval(function() {
    closed_over_counter++;
    console.log(closed_over_counter);
  }, 1000);

})(0);

由于使用的是IIFE而不是可以多次调用的函数,因此这毫无意义。您最好只在闭包内部声明变量。

(function() {
  var counter = 0;
  setInterval(function() {
    counter++;
    console.log(counter);
  }, 1000);
})();

答案 2 :(得分:2)

Nina Scholz的带有箭头功能的答案的模糊版本:

setInterval(((counter) => () => console.log(++counter))(0), 1000);