setTimeout(function,0)

来源:互联网 发布:rational rose mac 编辑:程序博客网 时间:2024/06/06 02:12

转载应注明出处

今天去tx面试的时候遇到这样一个问题,其中有一题是

<script type="text/javascript">for(var i=0;i<100;i++){setTimeout(function(){console.log(i);},0);}</script>

setTimeout是定时器,这个自行去了解,我想说的是这个0ms是咋回事

根据http://www.cnblogs.com/fullhouse/archive/2012/10/10/2718542.html这篇文章的描述有,

在实践中,setTimeout 会在其完成当前任何延宕事件的事件处理器的执行,以及完成文档当前状态更新后,告诉浏览器去启用 setTimeout 内注册的函数。

就题论题的讲,就是说script脚本加载完成了之后,setTimeout才会执行注册的函数,那么有多少setTimeout?

每个for循环都会执行一次setTimeout,并且第二个参数为0,就是说,等脚本执行完毕,会有100个function依次执行,那么每次function都会打印i,那么问题来了,此时脚本已经加载完毕,这时候i值多少?此时i值即为100。所以会打印出100个100来。

弄清楚这个,下面我自己测试了俩个用例,也挺有意思的,知道上面这个原理(如果你懂得),也不难弄明白下面这俩个例子的执行结果为何不同。

例1:

<script type="text/javascript">var j = 0;for(var i=0;i<100;i++){setTimeout(function(){console.log(j);console.log(i);j++;},0);}</script>

例2:

<script type="text/javascript">var j = 0;for(var i=0;i<100;i++){setTimeout(function(){console.log(j);console.log(i);},0);j++;}</script>


0 0