转载应注明出处
今天去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>