javascript回調函數

首先,我要告訴大家,回調函數不復雜。
然後,我再告訴大家,回調函數是一個簡單的概念。

A callback is a function that is passed as an argument to another function and is executed after its parent function has completed.

這是google對回調函數給出的概念。

如果想要中文解釋,可以這麼理解,

回調函數是一個作爲參數傳給另一個函數的函數,另一個函數裏面可以自由決定什麼時候執行回調函數。

注意了,中文解釋裏出現了“自由決定什麼時候執行回調函數”,而這恰恰就是回調函數爲什麼存在的原因。

下面舉一個簡單的例子,來說明我們回調函數是什麼。

 function  a(callback){
      alert('a');
      callback();// 
      } 
     function  b(){
       alert('b');
   }
   //調用
   a(b);

上面便是一個無參的回調函數的例子(而且是同步回調函數的例子,下面會講到同步回調的概念),很好理解,對吧。這時候可能就會有人問了,這還不如直接把function b(){}寫在function a(){}裏呢,回調函數不是畫蛇添足嗎。

這時候就引出回調函數爲什麼存在?

我上面說過,“自由決定什麼時候執行回調函數”,而這恰恰就是回調函數爲什麼存在的原因。所以這便牽扯到同步和異步的問題,而回調函數的光芒大都綻放在異步上!

那什麼是同步,什麼是異步呢?

同步的關鍵特性就是等待,而異步的關鍵特性就是不需要等待。舉一個生活中的例子。拿吃飯來說,吃飯大概可以分爲三個步驟:洗手,舉筷,吃飯。這三個事情是要依次進行的,後面的事情要等待前面的事情做完後才能進行。而在吃飯時,我們可以喝水,喝水是不需要等待吃飯的三個步驟的,到要喝水的時候就會進行。

現在是不是可以理解上面的同步回調函數的例子了,因爲

alert('b');

要在

alert('a');

的後面被執行。

接下來,看一個異步回調的例子,

function a(callback)
{
    setTimeout(function(){
    callback();
    },1000);

    alert("b"); //先打印b
};
function b(){
    alert("a"); //後打印a
}

a(b);

如果按照正常的函數調用,應該是先打印b, 後打印a. 但異步回調強調的是不需要等待,“打印b”不需要等待“打印a”完成之後再執行,而是在合適的時候被執行,而setTimeout()很好的完成了這個“合適的時候”。

所以,回調函數並不難,並不難,並不難,重要的事情說三遍。

發佈了32 篇原創文章 · 獲贊 23 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章