返回首页

我有一个循环,我想在调用setTimeout函数,并传递一些参数。

函数被调用5次,但不是我所期望的说法是,在每次的ARG1等于(5)
我所期望得到ARG1 = 0时,函数被称为第一次和第二次ARG1 = 1的结局与ARG1 = 4。

我得到的是什么(ARG1 = 5)每次。


foo();

function foo()

{

	for (var i = 0; i < 5; i++)

	{

		setTimeout(

		function(){

		callingByTimeout(i)

		}

		,100)

	}

}

function callingByTimeout(arg1)

{ 

	alert(arg1)

	//output for first time  : 5

	//output for second time : 5

	//output for third time  : 5

	//output for fourth time : 5

	//output for fifth time  : 5

}

提前感谢。

至于贾马尔:的| sjms |罗比Tendean

回答

评论会员:游客 时间:2012/02/07
incaunu:嗨,在你的榜样,setTimeout的回调函数是一个匿名函数。正因为如此,变量i的范围,不再是您预期的那样。当回调函数被调用时,i的值会从foo()函数,在那一刻的循环完成,这些值是5。您可以搜索这些东西。在谷歌罗比Tendean615的解决方案是伟大的
的sjms
评论会员:游客 时间:2012/02/07
。我找到了解决办法它的工作原理非常好:codeprelang="cs"foo();functionfoo(i){spanclass="code-keyword"for/span(spanclass="code-keyword"var/spani=spanclass="code-digit"0/span;i<spanclass="code-digit"5/span;i++){setTimeout(function(index){spanclass="code-keyword"return/spanfunction(){callingByTimeout(index);} }(i),spanclass="code-digit"1000/span)}}functioncallingByTimeout(arg1){alert(arg1)spanclass="code-comment"///spanspanclass="code-comment"outputforfirsttime:0/spanspanclass="code-comment"///spanspanclass="code-comment"outputforsecondtime:1/spanspanclass="code-comment"///spanspanclass="code-comment"outputforthirdtime:2/spanspanclass="code-comment"///spanspanclass="code-comment"outputforfourthtime:3/spanspanclass="code-comment"///spanspanclass="code-comment"outputforfifthtime:4/span}/pre/code的