for-循环中的setTimeout不打印连续值

for-循环中的setTimeout不打印连续值

我有一个剧本:

for (var i = 1; i <= 2; i++) {
    setTimeout(function() { alert(i) }, 100);}

3两次都发出警报,而不是1然后2.

有没有办法通过i,而不将函数写入字符串?


慕村9548890
浏览 488回答 3
3回答

MMMHUHU

可以使用立即调用的函数表达式(生命)在周围创建一个闭包setTimeout:for (var i = 1; i <= 3; i++) {&nbsp; &nbsp; (function(index) {&nbsp; &nbsp; &nbsp; &nbsp; setTimeout(function() { alert(index); }, i * 1000);&nbsp; &nbsp; })(i);}

LEATH

这是因为!这个超时函数回调在循环完成后都运行良好。事实上,作为计时器,即使每次迭代都是setTimeout(.,0),所有这些函数回调仍将在循环完成后严格运行,这就是为什么3被反映出来的原因!所有这两个函数,尽管它们是在每个循环迭代中分别定义的,但在相同的共享全局范围事实上,只有一个我在里面。这个解通过使用已执行的自函数(匿名函数或更多)来声明每个迭代的单个作用域。生命)并有一份i在里面,就像这样:for&nbsp;(var&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;<=&nbsp;2;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(function(){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;j&nbsp;=&nbsp;i; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setTimeout(function()&nbsp;{&nbsp;console.log(j)&nbsp;},&nbsp;100); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})();}清洁工会是for&nbsp;(var&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;<=&nbsp;2;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(function(i){&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setTimeout(function()&nbsp;{&nbsp;console.log(i)&nbsp;},&nbsp;100); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})(i);}使用生命(自执行函数)在每个迭代中为每个迭代创建了一个新的范围,这为我们的超时值函数回调每个迭代提供了关闭一个新范围的机会,这个范围中有一个变量,其中的每个迭代值都是正确的,我们可以访问它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript