JavaScript是同步的;JavaScript總是同步的且是單執行緒的,只有在可以進行ajax呼叫的意義上是異步的;同步表示如果正在頁面上執行JavaScript程式碼區塊,則該頁面上目前將不會執行其他JavaScript。
本教學操作環境:windows10系統、javascript1.8.5版、Dell G3電腦。
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中文網其他相關文章!