九句話輕鬆理解執行緒與非同步以及回撥函式
js非同步
九句話輕鬆理解執行緒與非同步以及回撥函式。
- 在js中沒有多執行緒,也就是說,在同一個時間只執行一個任務
- 但是如果真是這樣,那麼像一些事件(如使用者點選),如果永遠不點選,那麼後面的程式碼就永遠都要一直等待,這個等待是無意義的,並且cpu也是空閒的
- 所以把任務分成兩種:同步任務和非同步任務
- 所謂『同步任務』,就是一般任務,在js中一個一個的按續執行
- 所有同步任務都在主執行緒上執行,形成『執行棧』
- 『非同步任務』就是如(dom event, timer),他們並不先執行,而且先將它們放到『任務佇列』中(task queue),先進先出的執行。
- 『非同步任務』中必須指定『回撥函式』,『回撥函式』就是被主執行緒掛起來的程式碼,當主執行緒要執行『非同步任務』時,實際上就是執行回撥函式
- 佇列任務總是等執行棧中同步任務全部完成之後才執行
- 當執行棧的任務執行完後,開始讀取佇列任務中可以執行的任務(回撥函式),這時就將回撥函式加入到執行棧中執行,然後如此迴圈
分解來講就是
問題
在JavaScript中大部分程式碼都是同步一個一個執行的,如果此時你寫了一個click
事件,那使用者沒有觸發這個click,那按照同步的思想,click事件後面的程式碼都不會執行,直到你觸發該事件為止,這就丟擲了一個問題,我們如何來處理這些事件?要知道JavaScript是沒有多執行緒的。(關於多執行緒可以看我的這篇文章)
方法
這時就是非同步出場的時候了。對於非同步任務,JavaScript並不直接執行,而是將它推入一個佇列(關於佇列可以看棧與佇列),佇列中儲存的函式就是一個個的回撥函式。等當前執行環境執行完畢後,再執行佇列中的回撥函式。
例子
例子就比如說setTimeout()
函式。
function a(num) {
for (var i = 0; i < num; i++) {
(function(i) {
setTimeout(function() {
console.log("b:" + i);
}, 10);
})(i);
console.log("a:" + i);
}
}
a(5);
最後的輸出為:
eventUtil.js:42 a:0
eventUtil.js:42 a:1
eventUtil.js:42 a:2
eventUtil.js:42 a:3
eventUtil.js:42 a:4
eventUtil.js:38 b:0
eventUtil.js:38 b:1
eventUtil.js:38 b:2
eventUtil.js:38 b:3
eventUtil.js:38 b:4
例子解釋
可以看出先執行的是第42行的程式碼,後執行的是第38行程式碼,這很明顯是因為第38行的程式碼是非同步程式碼;而從b
的輸出是從0-4可以看出,這個非同步程式碼被存放在是佇列,因為這是先進先出載入的。
相關文章
- 執行緒回撥函式形參不能用引用執行緒函式
- ajax回撥函式執行順序帶來的同步非同步問題函式非同步
- 回撥函式的理解(一)函式
- Java回撥函式的理解Java函式
- java回撥函式-非同步回撥-簡明講解Java函式非同步
- Python 中的程式、執行緒、協程、同步、非同步、回撥Python執行緒非同步
- 深入理解 JavaScript 回撥函式JavaScript函式
- js 徹底理解回撥函式JS函式
- 回撥函式透徹理解Java函式Java
- 回撥函式 與 函式閉包函式
- 理解執行緒同步執行緒
- 聊聊執行緒與程式 & 阻塞與非阻塞 & 同步與非同步執行緒非同步
- 回撥函式函式
- 對執行緒、協程和同步非同步、阻塞非阻塞的理解執行緒非同步
- 程式與執行緒、同步與非同步、阻塞與非阻塞、併發與並行執行緒非同步並行
- 理解javascript中的回撥函式(callback)【轉】JavaScript函式
- 非同步/同步,阻塞/非阻塞,單執行緒/多執行緒概念梳理非同步執行緒
- 一個回撥函式不能操作Qt主執行緒設定Gui的問題函式QT執行緒GUI
- 【Java多執行緒】輕鬆搞定Java多執行緒(二)Java執行緒
- arcgis api for js回撥函式如何等待同步APIJS函式
- JavaScript 回撥函式JavaScript函式
- JavaScript回撥函式JavaScript函式
- JS—回撥函式JS函式
- 動畫回撥函式動畫函式
- java回撥函式Java函式
- 回撥函式(CallBack)函式
- 輕鬆理解JS函式節流和函式防抖JS函式
- [JS]回撥函式和回撥地獄JS函式
- 回撥函式,求積函式函式
- 回撥函式的作用與意義函式
- 回撥函式到promise再到理解async/await函式PromiseAI
- 對於Python中回撥函式的理解Python函式
- 輕鬆理解建構函式和原型物件函式原型物件
- 執行緒與同步非同步執行緒非同步
- JavaScript:鉤子函式與回撥函式的區別JavaScript函式
- C語言函式指標與回撥用函式C語言函式指標
- 輕輕鬆鬆找檔案--支援回撥函式的通用檔案查詢函式 (轉)函式
- 函式指標&回撥函式Callback函式指標