setTimeout()是js中的一类重要函数,将一段代码延迟必定时间并异步执行。可是这个函数常常不听话。在实践中,可能常常有人碰到相似下面的这种状况:面试
for (var i = 1; i <= 2; i++) { setTimeout(function() { alert(i) }, 100); }
咱们指望的结果是,先隔100毫秒弹出1,再隔100毫秒弹出2。可是跑起来后,alert的两次内容都是数字3,并且紧挨着输出,并非本身所指望的先1后2。有一种很基础的面试题是,如何合理改动代码,使它返回指望的结果?异步
其实很简单。在stackoverflow上早有大神解释了,能够参考这个连接函数
答案翻译成中文以下(并作了部分修改方便理解):oop
---------------------------------------------------------------------------------spa
你要为每一个定时器处理函数建立不一样的“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)code
“i”值乘以基础延迟值,因此循环5次将致使分别延迟5秒,10秒,15秒,20秒,和25秒。blog