标签:方法 定时 中介 循环 多少 highlight logs 程序 print
可能经常有人碰到类似下面的这种情况:
for (var i = 1; i <= 2; i++) { setTimeout(function() { alert(i) }, 100); }
跑起来后,alert的两次内容都是数字3,而不是自己所期望的先1后2。有一种基础面试题是,如何合理改动代码,使它返回期望的结果?
其实很简单。在stackoverflow上早有大神解释了,可以参考这个链接
答案翻译成中文如下(并做了部分修改方便理解):
---------------------------------------------------------------------------------
你要为每个定时器处理函数创建不同的“i”变量副本。比如这样:
function doSetTimeout(i) { setTimeout(function() { alert(i); }, 100); } for (var i = 1; i <= 2; ++i) doSetTimeout(i);
function doScaledTimeout(i) { setTimeout(function() { alert(i); }, i * 5000); }
(100毫秒超时,效果不会很明显,所以我设置的数字高达5000)
“i”值乘以基础延迟值,所以循环5次将导致分别延迟5秒,10秒,15秒,20秒,和25秒。
js经典面试问题:如何让for循环中的setTimeout()函数像预想中一样工作?
标签:方法 定时 中介 循环 多少 highlight logs 程序 print
原文地址:http://www.cnblogs.com/zamhown/p/6412545.html