在說回調之前先明白一點,純JavaScript代碼並不是異步的(不使用異步API等)。如果只用JavaScript代碼寫邏輯處理的話包括使用for循環,程序就是同步的。(有時候自己就不清醒)。
什么是回調函數?這個偷來的解釋講的很清楚:
對普通函數的調用:調用程序發出對普通函數的調用后,程序執行立即轉向被調用函數執行,直到被調用函數執行完畢后,再返回調用程序繼續執行。從發出調用的程序的角度看,這個過程為“調用-->等待被調用函數執行完畢-->繼續執行”
對回調函數調用:調用程序發出對回調函數的調用后,不等函數執行完畢,立即返回並繼續執行。這樣,調用程序執和被調用函數同時在執行。當被調函數執行完畢后,被調函數會反過來調用某個事先指定函數,以通知調用程序:函數調用結束。這個過程稱為回調(Callback),這正是回調函數名稱的由來。
所以回調函數的特點就是占用時間比較長(比如I/O,http請求等),使用回調函數就不需要等待回調函數的結果(系統幫你去執行了),程序直接執行你接下來的代碼。
但是有段代碼不懂:
1 var A = function (callback){ 2 callback(); 3 console.log("AAAAAAAA"); 4 } 5 var B = function (){ 6 for (var i = 0; i < 10000; i++) { 7 } 8 console.log("BBBBBBBB"); 9 } 10 A(B);
顯示結果為什么是:
BBBBBB
AAAAAA
是因為函數B中for循環是同步的,並且一直占用CPU嗎???????
下面這段代碼結果也詭異:BBBBBB,AAAAAA,然后test.txt的內容。
為什么????callback 的調用機制和執行順序肯定沒有剛才說的簡單。 mark一下,看懂回來改
看懂了 原來callback函數仍然在主線程中執行,所以,調用callback,當前線程還是會去執行callback碰到IO操作才會真的執行異步。網上有的解釋並沒有解釋清楚。
fs = require('fs'); var A = function (callback){ callback(); console.log("AAAAAAAA"); } var B = function (){ fs.readfile('test.txt','utf-8',function(err,data){ console.log(data); }); for (var i = 0; i < 10000; i++) { } console.log("BBBBBBBB"); } A(B);