首先要說的是,定時器相關的方法都是屬於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中我們會大量接觸關於異步的問題)