我是新手学习javascript并遇到我不理解的奇怪行为
所以这打印正是我所期望的。 0,1,2,3,4
var numberOfPlayers = 5;
for ( i = 0; i < numberOfPlayers; i++ ) {
alert(i);
}
但是当我尝试以下代码时,我想每1秒运行一次函数,5,5,5,5,5
var numberOfPlayers = 5;
for ( i = 0; i < numberOfPlayers; i++ ) {
setInterval(function () {
alert(i);
}, 1000);
}
任何人都可以向我解释这里发生了什么。我希望代码的两个部分都有相同的数字。
答案 0 :(得分:2)
在第一个实例中,当它绕过循环时,你会提醒i
的值。
在第二步中,您会在一秒钟后提醒i
的值。到第二个过去时,循环已经完成了五次,因此当时i
的值是i
的最后一个值。
答案 1 :(得分:1)
我没有被绑定在循环内部的内部函数中 - 就像这样在循环的每次迭代中绑定它
var numberOfPlayers = 5;
for ( i = 0; i < numberOfPlayers; i++ ) {
(function(i) {
setInterval(function () {
alert(i);
}, 1000);
})(i);
}
答案 2 :(得分:0)
你应该得到5 5 5 5 5.原因是你的for循环很快运行并绑定该函数运行5次。它遍历自身,直到i等于5.当第二个启动并且函数计划运行时,i等于5.然后每1秒重复5次。
答案 3 :(得分:0)
正如@Quentin在他的回答中所解释的那样,这是一个时间问题,因为setInterval()
内部的封闭。这里有一个很好的解释:Javascript infamous Loop issue?。
对于这样的情况,我可能会使用@Soren建议的代码。另一种选择是使用单独的函数:
var numberOfPlayers = 5;
for ( i = 0; i < numberOfPlayers; i++ ) {
intervalAlert(i);
}
function intervalAlert(i) {
setInterval(function () {
alert(i);
}, 1000);
}
另见http://blog.mixu.net/2011/02/03/javascript-node-js-and-for-loops/