将参数传递给javascript函数

Jan*_*roň 6 javascript parameter-passing

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

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

代码片段A(提醒10)

for(var i=0; i<10; i++) if(i==3) setTimeout(function() {alert(i);}, 100);
Run Code Online (Sandbox Code Playgroud)

小组B(提醒3)

for(var i=0; i<10; i++) if(i==3) setTimeout((function(p) {
   return function() {alert(p);}
} )(i), 100);
Run Code Online (Sandbox Code Playgroud)

Den*_*ret 4

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

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

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