事件迴圈與任務佇列是js中比較重要的兩個概念。這兩個概念在es5和es6兩個標準中有不同的實現。尤其在es6標準中,清楚的區分巨集觀任務佇列和微觀任務佇列才能解釋promise一些看似奇怪的表現。
總所周知js是單執行緒(非同步)
優點:不會有執行緒衝突
缺點:同步應用程式的開發比較容易,但由於需要在上乙個任務完成後才能開始新的任務,所以其效率通常比多執行緒應用程式低。如果完成同步任務所用的時間比預計時間長,應用程式可能會不響應,一句話來講就是效率慢。
當2345執行緒發生了一些事情,如果該執行緒發現,就會處理這些事情,這些執行緒需要處理的事情加到乙個事件佇列(記憶體)中。 當js引擎(js主線程)發現,執行棧裡面沒有任何內容的時候,才會去從事件佇列中拿出乙個程式加到自己的執行棧中js引擎(js主線程)從事件佇列中取出來執行,以及和宿主環境相配合,稱為事件迴圈。2.1js分為同步任務和非同步任務
2.2同步任務都在主線程上執行,形成乙個執行棧
2.3主線程之外,事件觸發執行緒管理著乙個任務佇列,只要非同步任務有了執行結果,就在任務佇列之中放置乙個事件。
2.4一旦執行棧中的所有同步任務執行完畢(此時js引擎空閒),系統就會讀取任務佇列,將可執行的非同步任務新增到可執行棧中,開始執行。
在es6中,有乙個新的概念建立在事件迴圈佇列之上,叫作任務佇列。這個概念給大家帶來的最大影響可能是promise的非同步特性。
script(整體**)
settimeout
setintervalpromise
還有其他的微任務,咱們暫時先不管。
前端高階攻略之ES6中的解構賦值
今天我們來 乙個新問題 之前在我們開發的過程中,難免會碰到這樣的情況 後端傳給我們一串資料,然後我們需要對這個資料進行處理。如果是這樣的乙個資料 let obj 然後我們需要用變數去儲存這些資料,那麼我們可能會這麼操作 let username obj.username,userid obj.use...
前端高階攻略之迭代器
1.什麼是迭代?從乙個資料集合中按照一定的順序,不斷的取出資料的過程 2.迭代和遍歷的區別?迭代強調的依次取出,不能確定可以取出的值有多少,也不能保證去把資料全部取完 遍歷必須保證資料的長度,迴圈不斷的全部取出,針對於資料量過大的情況下使用遍歷,需要時間過長 3.迭代器 對迭代過程的封裝,通常表現為...
前端高階攻略之ES6中的引數預設值
我們都清楚在呼叫函式的過程中,定義的引數缺失,此引數變數的值則會是undefined。怎麼給缺失的引數賦值預設值,在es6之前,並沒有太簡潔的方法,如下段 所示 function myfunction x,y,z myfunction 6 7 這種寫法是不是比較麻煩?預設值的設定是不是不夠直觀?fu...