闭包计数器在setInterval中

tec*_*kuz 3 javascript closures setinterval

我有一个功能:

setInterval(function () {
        var counter = 0;
        (function() {
          counter = counter + 1;
          console.log(counter);
          })(counter)
       }, 1000)
Run Code Online (Sandbox Code Playgroud)

为什么不增加柜台?(相反,它记录1的).如何使它登录升序号码?(1,2,3 ......)

Que*_*tin 5

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

(function(closed_over_counter) {

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

})(0);
Run Code Online (Sandbox Code Playgroud)

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

(function() {
  var counter = 0;
  setInterval(function() {
    counter++;
    console.log(counter);
  }, 1000);
})();
Run Code Online (Sandbox Code Playgroud)

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

{
  let counter = 0;
  setInterval(function() {
    counter++;
    console.log(counter);
  }, 1000);
}
Run Code Online (Sandbox Code Playgroud)


Nin*_*olz 5

您可以使用一个函数将函数作为闭包计数器返回.

setInterval(function(counter) {
    return function() {
        console.log(++counter);
    };
}(0), 1000);
Run Code Online (Sandbox Code Playgroud)