首先,我要告訴大家,回調函數不復雜。
然後,我再告訴大家,回調函數是一個簡單的概念。
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()很好的完成了這個“合適的時候”。
所以,回調函數並不難,並不難,並不難,重要的事情說三遍。