異步和單線程

單線程特點執行異步操作

js是單線程語言,瀏覽器只分配給js一個主線程,用來執行任務(函數),但一次只能執行一個任務,這些任務就會排隊形成一個任務隊列排隊等候執行.一般而已,相對耗時的操作是要通過異步來進行加載,可以避免導致頁面的假死.

1

2

3

setTimeout(function(){

console.log(這是timeout事件回調);

},1000);

執行這段代碼的時候,瀏覽器異步執行計時操作,傳入setTimeout的函數會被暫存起來,當1000ms到了後,會觸發定時事件,這個時候,就會把回調函數放到任務隊列裡,待所有程序執行完,處於空閒的狀態時,會立馬看看有沒有暫存起來要執行的任務,整個程序就是通過這樣的一個個事件驅動起來的,如下圖1.1所示:

異步和單線程

圖1.1 工作原理圖

"任務隊列"中的事件,除了IO設備的事件以外,還包括一些用戶產生的事件(比如鼠標點擊、頁面滾動等等),例如onClick事件,只要指定這些事件的異步操作,就會進入任務隊列中等待執行.

同步和異步的區別

同步在執行的過程會阻塞I/O,在正常的流程中執行的順序不同,例如setTimeout、setInterval,會改變流程執行的順序,儘管setTimeout的time延遲時間為0,其中的function也會被放入一個隊列中,等待下一個機會執行,當前的代碼(指不需要加入隊列中的程序)必須在該隊列的程序完成之前完成,因此結果可能不與預期結果相同。因此,異步能改變流程執行的順序,同步不會改變流程執行的順序,依次執行.


分享到:


相關文章: