setTimeout(function,0)
阿新 • • 發佈:2019-01-27
轉載應註明出處
今天去tx面試的時候遇到這樣一個問題,其中有一題是
<script type="text/javascript">
for(var i=0;i<100;i++){
setTimeout(function(){
console.log(i);
},0);
}
</script>
setTimeout是定時器,這個自行去了解,我想說的是這個0ms是咋回事
在實踐中,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>