2013-11-26 35 views
1

我工作的这个代码之谜从here的Javascript:setTimeout的,for循环,并

这里回调函数是我到目前为止有:

for (var i = 0; i < 1000; i += 100) { 
    waitFor(i, function then() { 
    console.log(i) 
    }) 
} 

// this will run a callback function after waiting milliseconds 
function waitFor(milliseconds, callback) { 
    setTimeout(callback.apply(), milliseconds) 
} 

此注销0至900,但它一次完成,然后在最后等待900毫秒(而不是等待每个console.log之间的毫秒)。

任何人都可以帮助我理解这一点吗?

+0

答案给原始是在这里:http://stackoverflow.com/q/750486/989121 – georg

+0

谢谢thg435我会看看那个。 – Ber

回答

0

你有事情在你的代码的两个不同的问题:

  1. 闭包是导致价值1000总是印刷,而不是100200 ...等
  2. 您正在使用的超时太总之,功能正在迅速地执行。

第一个问题很难在单个答案中解释,但我会尝试给你一些见解,因为将变量的值打印到控制台的函数是在for循环中定义的,该函数永远保持这种在那里,当循环结束,在您的情况,这是1000i值。

为了解决这个问题,就需要类似于@ thg435在他的评论中提到的东西,这样的事情:

// this will run a callback function after waiting milliseconds 
function waitFor(milliseconds, callback) { 
    setTimeout(callback, milliseconds); 
} 

function createFunction(i) { 
    return function() { console.log(i); }; 
} 

for (var i = 0; i < 1000; i += 100) { 
    waitFor(i, createFunction(i)); 
} 

第二个问题是,对于超时值实际上都是值是i采取其是循环它们是100200 ...等等这些都是非常小的值不到一秒钟,所以当for循环结束,这些功能都将准备好执行,使他们在其他以后得到立即执行一个。

为了解决这个问题,你需要乘以i通过10例如使用一个更大的时间间隔,如下所示:当循环将完成

waitFor(i*10, createFunction(i)); 
     ^^^^ 
+0

我试过了,它立即注销了“1000”10次。 – Ber

+0

@Ber我已经完全修改我的回答到一个新的,请编辑。当我第一次回答时,我非常忙碌,我把所有事情搞砸了,对此抱歉。 –

+0

感谢嗅探器的解释,我修改沿着这些线路的代码和它的作品吧! – Ber

0

首先计时器的通话将被happenned。在这种情况下,由于JS使用引用而不是值,所以i = 1000。要解决这种情况,你必须使用闭包。