jQuery and setTimeout inside For loop
本问题已经有最佳答案,请猛点这里访问。
我刚刚遇到一个非常奇怪的问题(虽然我修好了)但我想知道它为什么会在第一时间发生:
1 2 3 4 5 6 7 8 9 10 11 | function stuffAppear() { var i; for (i = 0; i < speech.length; i++) { apperance(i); } } function apperance(i) { var x = speech[i]; setTimeout(function() {$(speech[i]).fadeIn(1000); console.log(i);}, 1000 + i * 1500); console.log(speech[i]); } |
控制台日志显示"#yo0",然后显示"#ma0b"(这是必需的),但同时,它们从未消失
我玩了代码,直到我达到这个:
1 2 3 4 5 6 7 8 9 10 | function stuffAppear() { var i; for (i = 0; i < speech.length; i++) { apperance(i); } } function apperance(i) { var x = speech[i]; setTimeout(function() {$(x).fadeIn(1000); console.log(i);}, 1000 + i * 1500); } |
这就行了,但我不知道为什么第一个代码不起作用。 有人可以向我解释一下吗?
谢谢你!
在JSFiddle中,两个版本都可以正常工作(并且相同):
第一:http://jsfiddle.net/TrueBlueAussie/Bkz55/3/
1 2 3 4 5 6 7 8 9 10 11 12 13 | var speech = ["#yo0","#ma0b","#blah"]; function stuffAppear() { var i; for (i = 0; i < speech.length; i++) { apperance(i); } } function apperance(i) { var x = speech[i]; setTimeout(function() {$(speech[i]).fadeIn(1000); console.log(i);}, 1000 + i * 1500); console.log(speech[i]); // <<< THIS WOULD OCCUR IMMEDIATELY } |
第二:http://jsfiddle.net/TrueBlueAussie/Bkz55/4/
1 2 3 4 5 6 7 8 9 10 11 12 | var speech = ["#yo0","#ma0b","#blah"]; function stuffAppear() { var i; for (i = 0; i < speech.length; i++) { apperance(i); } } function apperance(i) { var x = speech[i]; setTimeout(function() {$(x).fadeIn(1000); console.log(i);}, 1000 + i * 1500); } |
所以我怀疑你看到的是你的其他代码的副作用(未显示)。
唯一奇怪的是你在第一个版本登录两次(一次在setTimeout之外,它会在开始时显示 - 正如你所提到的那样)
跟进:
现在已经看到了真正的代码,原因是在超时期间更改了