可能重复:
Javascript closure inside loops - simple practical example
javascript variable scope/closure in loop after timeout
您能否逐步解释为何结果不同?
代码段A (提醒10)
for(var i=0; i<10; i++) if(i==3) setTimeout(function() {alert(i);}, 100);
代码段B (提醒3)
for(var i=0; i<10; i++) if(i==3) setTimeout((function(p) {
return function() {alert(p);}
} )(i), 100);
答案 0 :(得分:4)
变量的范围是全局范围(浏览器中的window
)或函数。
在第一种情况下,i
在包含for
循环的范围中定义。这就是为什么在执行给setTimeout
的回调之前它仍然会在循环结束之前发生变化的原因。
在第二种情况下,中间函数包含并保留另一个变量p
。请注意,这可以在没有测试的情况下工作,因为对于每个setTimeout
来说这将是一个不同的闭包。