1. 程式人生 > >setTimeout(function,0)

setTimeout(function,0)

轉載應註明出處

今天去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>