首頁  >  文章  >  web前端  >  關於JavaScript的非同步運行機制介紹

關於JavaScript的非同步運行機制介紹

高洛峰
高洛峰原創
2017-03-19 16:19:051217瀏覽

----非同步運行機制如下:

1.左右同步任務都在主執行緒上執行,形成執行堆疊

2.主執行緒值外,還存在一個任務佇列,只要非同步任務有了運行結果,就在任務佇列中放置一個事件

3.一旦執行堆疊中的所有同步任務執行完畢,系統會讀取任務佇列並將對應要執行的任務放到主執行緒中,主執行緒結束等待狀態,進入執行棧,開始執行

#(只要主執行緒空了,就會讀取任務佇列,這就是 JavaScript運行機制,這個過程不斷重複)

4.主執行緒重複上述步驟

#----為什麼JavaScript是單執行緒:

1.JavaScript一次只能做一件事,作為瀏覽器腳本語言,多個執行緒中進行的操作可能會造成衝突,所以JavaScript只能是單執行緒

----HTML5標準規定了setTimeout()的第二個參數的最小值(最短間隔),不得低於4毫秒,如果低於這個值,就會自動增加。在此之前,舊版的瀏覽器都將最短間隔設為10毫秒。另外,對於那些DOM的變動(尤其是涉及頁面重新渲染的部分),通常不會立即執行,而是每16毫秒執行一次。這時使用requestAnimationFrame()的效果比setTimeout()好。

要注意的是,setTimeout()只是將事件插入了"任務佇列",必須等到目前程式碼(執行堆疊)執行完,主執行緒才會去執行它指定的回呼函數。要是當前程式碼耗時很長,有可能要等很久,所以沒有辦法保證,回呼函數一定會在setTimeout()指定的時間執行。

----

"任務隊列"是事件的隊列(也可以理解成訊息的隊列),IO設備完成一項任務,就在「任務隊列」中添加一個事件,表示相關的非同步任務可以進入"執行棧"了。主執行緒讀取"任務佇列",就是讀取裡面有哪些事件。

"任務佇列"中的事件,除了IO裝置的事件以外,還包含一些使用者產生的事件(例如滑鼠點擊、頁面捲動等等)。只要指定過回呼函數,這些事件發生時就會進入"任務佇列",等待主執行緒讀取。

所謂"回呼函數"(callback),就是那些會被主執行緒掛起來的程式碼。非同步任務必須指定回呼函數,當主執行緒開始執行非同步任務,就是執行對應的回呼函數。

"任務佇列"是一個先進先出的資料結構,排在前面的事件,優先被主執行緒讀取。主執行緒的讀取過程基本上是自動的,只要執行堆疊一清空,"任務佇列"上第一位的事件就會自動進入主執行緒。但是,由於存在後文提到的"定時器"功能,主執行緒首先要檢查執行時間,某些事件只有到了規定的時間,才能回到主執行緒。

----JavaScript中沒有任何程式碼時立即執行的,都是在進程空閒時盡快執行

以上是關於JavaScript的非同步運行機制介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn