摘要:只要指定過這些事件的回調函數,這些事件發生時就會進入任務隊列,等待主線程讀取。異步任務必須指定回調函數,當主線程開始執行異步任務,就是執行對應的回調函數。
javascript語言是一門“單線程”的語言,
不像java語言,類繼承Thread再來個thread.start就可以開辟一個線程。
所以,javascript就像一條流水線,僅僅是一條流水線而已,要么加工,要么包裝,不能同時進行多個任務和流程。
“同步”——一下就讓人想到“一起”這個詞;
“異步”呢,從字面來講,好像是在不同的(異)的ways上do something,
那首先想到的詞可能是“一邊...一邊...”,比如‘小明一邊吃雪糕一邊寫作業’,這完全沒毛病,雪糕吃完了,作業也寫完了,這就是異步?那就大錯特錯了!
其實同步和異步,
無論如何,做事情的時候都是只有一條流水線(單線程),
同步和異步的差別就在于這條流水線上各個流程的執行順序不同。
最基礎的異步是setTimeout和setInterval函數,
很常見,但是很少人有人知道其實這就是異步,
因為它們可以控制js的執行順序。我們也可以簡單地理解為:
可以改變程序正常執行順序的操作就可以看成是異步操作。如下代碼:
console.log( "1" ); setTimeout(function() { console.log( "2" ) }, 0 ); setTimeout(function() { console.log( "3" ) }, 0 ); setTimeout(function() { console.log( "4" ) }, 0 ); console.log( "5" );
輸出順序是什么呢?
可見,盡管我們設置了setTimeout(function,time)中的等待時間為0,結果其中的function還是后執行。
盡管setTimeout的time延遲時間為0,
其中的function也會被放入一個隊列中,等待下一個機會執行,
當前的代碼(指不需要加入隊列中的程序)必須在該隊列的程序完成之前完成,
因此結果可能不與預期結果相同。
這里說到了一個“隊列”(即任務隊列),
該隊列放的是什么呢,放的就是setTimeout中的function,
這些function依次加入該隊列,
即該隊列中所有function中的程序將會在該隊列以外的所有代碼執行完畢之后再以此執行,
這是為什么呢?因為在執行程序的時候,瀏覽器會默認setTimeout以及ajax請求這一類的方法都是耗時程序(盡管可能不耗時),
將其加入一個隊列中,該隊列是一個存儲耗時程序的隊列,在所有不耗時程序執行過后,再來依次執行該隊列中的程序。
又回到了最初的起點——javascript是單線程。 單線程就意味著,所有任務需要排隊,前一個任務結束,才會執行后一個任務。
如果前一個任務耗時很長,后一個任務就不得不一直等著。
于是就有一個概念——任務隊列。如果排隊是因為計算量大,CPU忙不過來,倒也算了,
但是很多時候CPU是閑著的,因為IO設備(輸入輸出設備)很慢(比如Ajax操作從網絡讀取數據),不
得不等著結果出來,再往下執行。于是JavaScript語言的設計者意識到,這時主線程完全可以不管IO設備,
掛起處于等待中的任務,先運行排在后面的任務。等到IO設備返回了結果,再回過頭,把掛起的任務繼續執行下去。
于是,所有任務可以分成兩種,
一種是同步任務(synchronous),另一種是異步任務(asynchronous)。 同步任務指的是,在主線程上排隊執行的任務,
只有前一個任務執行完畢,才能執行后一個任務; 異步任務指的是,不進入主線程、而進入"任務隊列"(task queue)的任務,
只有等主線程任務執行完畢,"任務隊列"開始通知主線程,請求執行任務,該任務才會進入主線程執行。
具體來說,異步運行機制如下:
所有同步任務都在主線程上執行,形成一個執行棧(execution context stack)。
主線程之外,還存在一個"任務隊列"(task queue)。只要異步任務有了運行結果,就在"任務隊列"之中放置一個事件。
一旦"執行棧"中的所有同步任務執行完畢,系統就會讀取"任務隊列",看看里面有哪些事件。那些對應的異步任務,于是結束等待狀態,進入執行棧,開始執行。
主線程不斷重復上面的第三步。
只要主線程空了,就會去讀取"任務隊列",這就是JavaScript的運行機制。這個過程會不斷重復。
"任務隊列"中的事件,除了IO設備的事件以外,
還包括一些用戶產生的事件(比如鼠標點擊、頁面滾動等等),
比如$(selectot).click(function),這些都是相對耗時的操作。
只要指定過這些事件的回調函數,這些事件發生時就會進入"任務隊列",等待主線程讀取。
所謂"回調函數"(callback),就是那些會被主線程掛起來的代碼,前面說的點擊事件$(selectot).click(function)中的function就是一個回調函數。異步任務必須指定回調函數,當主線程開始執行異步任務,就是執行對應的回調函數。例如ajax的success,complete,error也都指定了各自的回調函數,這些函數就會加入“任務隊列”中,等待執行。
作者:YinghaoGuo
來源:CSDN
原文:https://blog.csdn.net/qq_2285...
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/101357.html
摘要:同步和異步的區別是什么是單線程的,只能同時做一件事,所以就需要異步同步會阻塞代碼執行,而異步不會是同步,是異步異步同步秒之后點擊確認何時需要異步在可能發生等待的情況,等待過程中不能像一樣阻塞程序進行。因此,所有等待的情況都需要異步。 同步和異步的區別是什么? js是單線程的,只能同時做一件事,所以就需要異步同步會阻塞代碼執行,而異步不會alert是同步,setTimeout是異步 //...
摘要:事件中屬性等于。響應的狀態為或者。同步在上會產生頁面假死的問題。表示聲明的變量未初始化,轉換為數值時為。但并非所有瀏覽器都支持事件捕獲。它由兩部分構成函數,以及創建該函數的環境。 1 介紹JavaScript的基本數據類型Number、String 、Boolean 、Null、Undefined Object 是 JavaScript 中所有對象的父對象數據封裝類對象:Object、...
摘要:參考資料前端模塊化詳解完整版入門近一萬字的語法知識點補充徹底搞清楚中的和和詳解 前言 前端的模塊化之路經歷了漫長的過程,想詳細了解的小伙伴可以看浪里行舟大神寫的前端模塊化詳解(完整版),這里根據幾位大佬們寫的文章,將模塊化規范部分做了匯總和整理,希望讀完的小伙伴能有些收獲,也希望覺得有用的小伙伴可以點個贊,筆芯。 什么是模塊 將一個復雜的程序依據一定的規則(規范)封裝成幾個塊(文件)...
摘要:同步與異步以上為同步代碼,函數必須等函數執行完畢后才能執行。異步回調產生的結果就是,函數的調用并不直接返回結果,而往往是交給回調函數進行異步處理。 同步與異步: function a(){} function b(){} a(); b(); 以上為同步代碼,函數b必須等函數a執行完畢后才能執行。 function a(){ ...
摘要:調用棧被清空,消息隊列中并無任務,線程停止,事件循環結束。不確定的時間點請求返回,將設定好的回調函數放入消息隊列。調用棧執行完畢執行消息隊列任務。請求并發回調函數執行順序無法確定。 異步編程 JavaScript中異步編程問題可以說是基礎中的重點,也是比較難理解的地方。首先要弄懂的是什么叫異步? 我們的代碼在執行的時候是從上到下按順序執行,一段代碼執行了之后才會執行下一段代碼,這種方式...
閱讀 2135·2021-10-14 09:43
閱讀 2197·2019-08-30 15:55
閱讀 726·2019-08-30 14:23
閱讀 2019·2019-08-30 13:21
閱讀 1235·2019-08-30 12:50
閱讀 2199·2019-08-29 18:46
閱讀 2280·2019-08-29 17:28
閱讀 2359·2019-08-29 17:21