将参数传递给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);