将参数传递给javascript函数

将参数传递给javascript函数,javascript,parameter-passing,Javascript,Parameter Passing,可能重复: 你能一步一步地解释为什么结果不同吗 片段A(警报10) for(var i=0;i变量的范围是全局范围(浏览器中的窗口)或函数 在第一种情况下,在包含for循环的的范围中定义了i。这就是为什么在执行setTimeout回调之前,它仍然会更改,直到循环结束 在第二种情况下,中间函数包含并保留另一个变量,p。请注意,这在没有测试的情况下是有效的,因为这将是每个setTimeout的一个不同的结束。这个基本问题一直是这里数百个问题的主题。答案很简单:i参考超时处理程序中的enced是外

可能重复:

你能一步一步地解释为什么结果不同吗

片段A(警报10)


for(var i=0;i变量的范围是全局范围(
浏览器中的窗口)或函数

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


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

的一个不同的结束。这个基本问题一直是这里数百个问题的主题。答案很简单:
i
参考超时处理程序中的enced是外部作用域中的
i
,它正在被循环更改。也就是说,只涉及一个
i
。@Pointy找到一个重复的,然后标记它。基本上开始键入一个问题,用“javascript”、“循环”和“timeout”或“handler”.哦,我明白了。我想参数总是通过引用传递的,对吗?不,它们总是通过值传递,但在第一种情况下,直到调用警报,我才被传递。此时循环已经结束。但请注意“通过值传递vs通过引用传递”:对于基元类型很清楚,但变量的值可以是对对象的引用。
for(var i=0; i<10; i++) if(i==3) setTimeout(function() {alert(i);}, 100);
for(var i=0; i<10; i++) if(i==3) setTimeout((function(p) {
   return function() {alert(p);}
} )(i), 100);