首頁 > web前端 > 前端問答 > javascript是同步的嗎

javascript是同步的嗎

WBOY
發布: 2022-08-24 17:10:56
原創
1614 人瀏覽過

JavaScript是同步的;JavaScript總是同步的且是單執行緒的,只有在可以進行ajax呼叫的意義上是異步的;同步表示如果正在頁面上執行JavaScript程式碼區塊,則該頁面上目前將不會執行其他JavaScript。

javascript是同步的嗎

本教學操作環境:windows10系統、javascript1.8.5版、Dell G3電腦。

javascript是同步的嗎

JavaScript總是同步的且是單執行緒的。

如果您正在頁面上執行JavaScript程式碼區塊,則該頁面上目前將不會執行其他JavaScript。

JavaScript只在可以進行Ajax呼叫的意義上是非同步的。

Ajax呼叫將停止執行,其他程式碼將能夠執行,直到呼叫返回(成功或其他)為止,此時回呼將同步運行。此時將不會再運行其他程式碼。它不會中斷當前正在運行的任何其他程式碼。

JavaScript計時器與此相同類型的回呼一起運作。

將JavaScript描述為非同步可能會造成誤解。準確地說JavaScript是同步的且具有各種回呼機制的單執行緒。

jQuery在Ajax呼叫上有一個選項可以使它們同步(帶有該async: false選項)。初學者可能會不正確地使用它,因為它允許使用一種更傳統的程式設計模型,而這種模型可能會更習慣。有問題的原因是此選項將阻止頁面上的 所有

JavaScript,直到完成為止,包括所有事件處理程序和計時器。

擴充知識

#Javascript語言是單執行緒的語言

#單執行緒和非同步確實不能同時成為一個語言的特性。 js選擇了成為單執行緒的語言,所以它本身不可能是異步的。因為瀏覽器只分配給js一個主線程,用來執行那些函數,一次只能執行一個,這些任務形成一個任務隊列排隊等候執行,但前端的某些任務是非常耗時的,比如網絡請求,定時器和事件監聽,如果讓他們和別的任務一樣,都老老實實的排隊等待執行的話,執行效率會非常的低,甚至導致頁面的假死。

JavaScript單線程如何實現非同步效果

#所以,瀏覽器為這些耗時任務開闢了另外的線程,主要包括http請求線程,瀏覽器定時觸發器,瀏覽器事件觸發線程。宿主環境(瀏覽器)透過事件驅動方式使得js具備了非同步的屬性 。

所有任務可以分成兩種,一種是同步任務(synchronous),另一種是非同步任務(asynchronous)。同步任務指的是,在主執行緒上排隊執行的任務,只有前一個任務執行完畢,才能執行後一個任務;非同步任務指的是,不進入主執行緒、而進入"任務佇列"(task queue)的任務,只有等主線程任務執行完畢,"任務隊列"開始通知主線程,請求執行任務,該任務才會進入主線程執行。

CPU忙不過來,倒也算了,但是很多時候CPU是閒著的,因為IO設備(輸入輸出設備)很慢(例如Ajax操作從網路讀取資料),不得不等著結果出來,再往下執行。

具體來說,非同步運行機制如下:

所有同步任務都在主執行緒上執行,形成執行堆疊(execution context stack)。

主執行緒之外,還存在一個"任務佇列"(task queue)。只要非同步任務有了運行結果,就在"任務隊列"之中放置一個事件。

一旦"執行堆疊"中的所有同步任務執行完畢,系統就會讀取"任務佇列",那些的非同步任務,進入執行堆疊,開始執行。

主執行緒不斷重複上面的第三步。

【相關推薦:javascript影片教學web前端

以上是javascript是同步的嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板