摘要:首先要知道的是,回調和異步不是同一個東西我以前認為中每個回調函數都是異步處理的,實際上并不是,可以同步回調,也可以異步回調例子說到,大家都在中遇到以下的例子這些代碼用了這么久,知道怎么用,但是可能對回調的概念并不是那么清晰再來個例子執行函數
首先要知道的是,回調和異步不是同一個東西
我以前認為js中每個回調函數都是異步處理的,實際上并不是,可以同步回調,也可以異步回調
說到callback,大家都在javascript中遇到以下的例子
$("#id").on("click", function(){ //code }); $("#id").setTimeout(function(){ //code },1000);
這些代碼用了這么久,知道怎么用,但是可能對回調的概念并不是那么清晰
再來個例子
function a(callback) { alert("執行parent函數a!"); alert("開始調用回調函數"); callback(); alert("結束回調函數"); } function b(){ alert("執行回調函數b"); } function test() { a(b); a(function() { alert("執行匿名回調函數"); }); } test();
執行順序:
執行parent函數a!
開始調用回調函數
執行回調函數b
結束回調函數
執行parent函數a!
開始調用回調函數
執行匿名回調函數
結束回調函數
簡單的說,就是把一個函數作為形參進行傳遞,上面的callback參數可以改為任意名字
callback 用 C++ 實現 不帶參數回調#include帶參數回調using namespace std; //定義回調函數 void Print() { cout <<"Hello World! "; } //定義實現回調函數的"調用函數" void Call(void (*callback)()) { callback(); } //在main函數中實現函數回調 int main(int argc,char* argv[]) { Call(Print); return 0; }
#include異步例子using namespace std; //定義帶參回調函數 void Print(string s) { cout << s << endl; } //定義實現帶參回調函數的"調用函數" void Call(void (*callback)(string),string s) { callback(s); } //在main函數中實現帶參的函數回調 int main(int argc,char* argv[]) { Call(Print,"Hello World!"); return 0; }
經典例子
function a(){ console.log("執行a"); setTimeout(function(){ console.log("setTimeout"); }, 1000); } function b(){ console.log("執行b"); } a(); b();
執行順序:
執行a
執行b
setTimeout (一秒后執行)
都知道js是單線程的,所謂的單線程就是一次只能完成一個任務,其任務的調度方式就是排隊,毫無疑問,這樣的效率是不高的,后面的任務必須等到前面的任務執行完畢后才能執行,如果有一個比較耗時的操作,比如http請求,文件io
其他語言遇到這種比較耗時的任務往往是開一個線程來處理,但js本身就是單線程的,js對這種任務的處理就是這個一個任務掛載起來,等耗時任務完成后再把回調函數添加到執行隊列尾部
所以,在剛剛這個例子中,即使把延遲時間設置為0,也是一樣的結果
本文同步更新我的個人博客https://blog.yjqing.xin/js-ca...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/99211.html
摘要:同步與異步以上為同步代碼,函數必須等函數執行完畢后才能執行。異步回調產生的結果就是,函數的調用并不直接返回結果,而往往是交給回調函數進行異步處理。 同步與異步: function a(){} function b(){} a(); b(); 以上為同步代碼,函數b必須等函數a執行完畢后才能執行。 function a(){ ...
摘要:而是在調用發出后,被調用者通過狀態通知來通知調用者,或通過回調函數處理這個調用。請求程序發出請求,從服務器端獲取數據,并設置了回調函數。然后,瀏覽器會設置偵聽來自網絡的響應,拿到數據后,將該回調函數插入到事件循環。 并發與并行 并發是指兩個或多個事件鏈隨時間發展交替執行,以至于從更高的層次來看,就像是同時運行(但在任意時刻只處理一個事件) 并發的關鍵是你有處理多個任務的能力,不一定同...
摘要:引擎線程也稱為內核,負責處理腳本程序例如引擎引擎線程負責解析腳本,運行代碼。對象代表一個未完成但預計將來會完成的操作。注意一旦新建就會立即執行它屬于,無法取消。 寫在前面: 第一遍學Promise時, 只是大概過了一遍, 感覺學的不夠深入, 這一篇算是對之前的一個總結吧. Promise在ES6中也屬于一個較難理解的一部分; 所以在學習一個比較難理解的知識點時, 我們可以圍繞這個知識點...
摘要:單線程異步非阻塞然后,這又牽扯到了事件循環消息隊列,還有微任務宏任務這些。此步的位置不確定某個時刻后,定時器觸發線程通知事件觸發線程,事件觸發線程將回調函數加入消息隊列隊尾,等待引擎線程執行。 前言 Philip Roberts 在演講 great talk at JSConf on the event loop 中說:要是用一句話來形容 JavaScript,我可能會這樣: Java...
閱讀 853·2021-11-24 09:38
閱讀 1085·2021-10-08 10:05
閱讀 2577·2021-09-10 11:21
閱讀 2800·2019-08-30 15:53
閱讀 1827·2019-08-30 15:52
閱讀 1964·2019-08-29 12:17
閱讀 3418·2019-08-29 11:21
閱讀 1609·2019-08-26 12:17