javascript setInterval内的Closure计数器

tpxzln5u  于 2023-06-28  发布在  Java
关注(0)|答案(3)|浏览(83)

我有一个函数:

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

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

a8jjtwal

a8jjtwal1#

1.你传递了一个参数给你的匿名函数,但是你没有把这个参数赋给一个变量。你忘了在函数定义中加入参数。
1.每次迭代都创建新变量,而不是在它们之间共享变量。你需要把你的逻辑从里到外。

(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);
})();

或者,由于Internet Explorer不再是大多数人关心的问题,因此可以放弃IIFE,而使用块。

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

yrwegjxp2#

你可以使用一个函数来返回一个函数作为闭包。

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

oknwwptz3#

带有箭头函数的Nina Scholz答案的模糊版本:

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

相关问题