JS定時器和單執行緒非同步特性

克里斯瑪發表於2018-07-06

首先要說的是,定時器相關的方法都是屬於BOM方法,而定時器呢,它是用於在設定的時
間執行一段程式碼,或者在給定的時間間隔內重複該程式碼。具體函式:

setTimeout(callback, delay);//delay一定的時間後,執行回撥函式只執行一次
setInterval(callback, delay);//每隔一段時間執行一次callback,反覆執行
clearInterval(timer);//清除定時器

定時器確實很好用,但是卻又不好用,為什麼這麼說呢?
我們知道JS是單執行緒的,既然是單執行緒那麼就很容易出現執行緒被堵塞的情況,怎麼解決
呢?——非同步!
當然JS是單執行緒的它本身是不能非同步的,但JS的宿主環境(比如瀏覽器,node)是多執行緒
的,宿主環境通過某種方式(比如:node的事件驅動)使得JS具備了非同步的特性。
為什麼突然談起JS的單執行緒非同步呢?因為定時器事件會被JS非同步處理,什麼意思?
用程式碼來說:

1 var num = 1;
2 setTimeout(function() {
3     num++;
4     console.log(num);
5 }, 1000);
6 console.log(num); //結果並是不(2,1)而是(1,2)

為什麼會這樣?前面說過了,JS會把定時器事件非同步處理,也就是說它並不會等待定時器事件

處理完成後再執行下面的程式碼,而是直接將定時器事件插入到事件佇列當中後,直接執行下面

的程式碼,當定時器事件執行完成後JS再反過頭來執行定時器事件的回撥部分程式碼,這就是非同步!

非同步可以有效的防止JS執行緒被堵塞,且會有很高的效率,能夠使JS在有限的資源下做更多的事

情,這一點是很了不起的。(node中我們會大量接觸關於非同步的問題)

相關文章