关于在JavaScript闭包中立即执行函数

时间:2017-01-06 03:11:35

标签: javascript jquery loops closures



for(var i = 0; i < 10; i++) {
    setTimeout(function() {
        console.log(i);
    }, 2000);
}
&#13;
&#13;
&#13;

通过这种方式,我知道它会提醒所有人。因为在我被分配到3之后调用了这些函数。

但是在下面的代码中,我无法理解为什么会发生这种情况。

&#13;
&#13;
public interface ISpecification<T>
{
    Expression<Func<T, bool>> Criteria { get; }
}
&#13;
&#13;
&#13;

在我看来,当我被分配到0时,第一个函数setTimeout将在我被分配到1之前执行。

这个循环的顺序错了吗?

2 个答案:

答案 0 :(得分:1)

在for循环结束后将调用console.log(i),因为var的方式是函数作用域的for循环。到达console.log语句时,它将在10时(2000ms)。提供预期结果的一种方法是使用let而不是var。但是,您使用let删除了一些浏览器支持。

关于这个主题的好读物将是{{3}}。

for(let i = 0; i < 10; i++) {
    setTimeout(function() {
        console.log(i);
    }, 2000);
}

答案 1 :(得分:0)

您需要将i变量放入闭包中,否则,它将在每次循环迭代中重写。对于setTimeout函数也是如此,你应该将i变量放入一个闭包中。

&#13;
&#13;
var funcs=[];
for(var i=0;i<3;i++){

 (function(i){ 
    funcs[i]=function(){
      console.log(i);
    };
  })(i);
}

for(var j=0;j<3;j++){
  funcs[j]();
  }
&#13;
&#13;
&#13;