6

可能重复:
循环内的 Javascript 闭包 - 超时后循环中的简单实用示例
javascript 变量范围/闭包

您能否逐步解释为什么结果不同?

片段 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);
4

1 回答 1

4

变量的作用域是全局作用域(window在浏览器中)或函数。

在第一种情况下i,定义在包含for循环的范围内。这就是为什么在执行给定的回调之前它仍然会变化,直到循环结束setTimeout

在第二种情况下,中间函数包含并保留另一个变量p。请注意,如果没有测试,这将是有效的,因为这对于每个setTimeout.

于 2012-11-25T17:22:10.727 回答