【问题标题】:Passing arguments to javascript function [duplicate]将参数传递给javascript函数[重复]
【发布时间】:2012-11-13 06:06:24
【问题描述】:

可能重复:
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);

【问题讨论】:

  • 这个基本问题已经成为这里数百个问题的主题。答案很简单:超时处理程序中引用的i 是来自外部作用域的i,它正在被循环更改。也就是说,只涉及一个i。
  • @Pointy 找到一个副本然后标记它。
  • 基本上开始输入带有“javascript”、“loop”和“timeout”或“handler”字样的问题。

标签: javascript parameter-passing


【解决方案1】:

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

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

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

【讨论】:

  • 哦,我明白了。我想参数总是通过引用传递的,对吧?
  • 不,它们总是按值传递,但在第一种情况下,直到调用警报才传递 i。此时循环已经结束。但要小心“按值传递与按引用传递”:对于原始类型很清楚,但变量的值可以是对对象的引用。
猜你喜欢
  • 2013-07-09
  • 2022-01-26
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2011-10-02
  • 2016-01-16
  • 2023-04-03
相关资源
最近更新 更多