JS--回調函數callback的疑惑


在說回調之前先明白一點,純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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM