for(var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 2000);
}
&#13;
通过这种方式,我知道它会提醒所有人。因为在我被分配到3之后调用了这些函数。
但是在下面的代码中,我无法理解为什么会发生这种情况。
public interface ISpecification<T>
{
Expression<Func<T, bool>> Criteria { get; }
}
&#13;
在我看来,当我被分配到0时,第一个函数setTimeout将在我被分配到1之前执行。
这个循环的顺序错了吗?
答案 0 :(得分:1)
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
变量放入一个闭包中。
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;