完全理解JavaScript中回調函數 (推薦)

在javascript中回調函數很是重要,它們幾乎無處不在。像其餘更加傳統的編程語言都有回調函數概念,可是很是奇怪的是,完完整整談論回調函數的在線教程比較少,卻是有一堆關於call()和apply()函數的,或者有一些簡短的關於callback的使用示例。
首先你得先明白一點:javascript

函數也是對象

 想弄明白回調函數,首先的清楚地明白函數的規則。先來看個例子:java

//能夠這樣建立函數
var fn = new Function("arg1", "arg2", "return arg1 * arg2;");
fn(2, 3);   //6

 這樣作的一個好處,能夠傳遞代碼給其餘函數,也能夠傳遞正則變量或者對象(由於代碼字面上只是對象而已)。
在javascript中,函數是比較奇怪的,但它確確實實是對象。確切地說,函數是用Function()構造函數建立的Function對象。Function對象包含一個字符串,字符串包含函數的javascript代碼。編程

理解了函數也是對象,先不急聊回調函數,先看看下面代碼:app

function say (value) {
    alert(value);
}
alert(say);
alert(say('hi js.'));

只寫變量名 say 返回的將會是 say方法自己,以字符串的形式表現出來。
而在變量名後加()如say()返回的就會使say方法調用後的結果,這裏是彈出value的值。編程語言

js中函數能夠做爲參數傳遞

再看下面兩段代碼:函數

function say (value) {
    alert(value);
}
function execute (someFunction, value) {
    someFunction(value);
}
execute(say, 'hi js.');

spa

function execute (someFunction, value) {
    someFunction(value);
}
execute(function(value){alert(value);}, 'hi js.');

上面第一段代碼是將say方法做爲參數傳遞給execute方法
第二段代碼則是直接將匿名函數做爲參數傳遞給execute方法code

實際上:對象

function say (value) {
    alert(value);
}
// 注意看下面,直接寫say方法的方法名與下面的匿名函數能夠認爲是一個東西
// 這樣再看上面兩段代碼是否是對函數能夠做爲參數傳遞就更加清晰了
say;

function (value) {
    alert(value);
}

這裏的say或者匿名函數就被稱爲回調函數!blog

若是還不懂,看看下面並非很完美的比喻:
你到一個商店買東西,恰好你要的東西沒有貨,因而你在店員那裏留下了你的電話,過了幾天店裏有貨了,店員就打了你的電話,而後你接到電話後就到店裏去取了貨。在這個例子裏,你的電話號碼就叫回調函數,你把電話留給店員就叫登記回調函數,店裏後來有貨了叫作觸發了回調關聯的事件,店員給你打電話叫作調用回調函數,你到店裏去取貨叫作響應回調事件。
clipboard.png

回調函數容易混淆點——傳參

兩種回調函數傳參的方法:

  • 將回調函數的參數做爲與回調函數同等級的參數進行傳遞

clipboard.png

  • 回調函數的參數在調用回調函數內部建立

clipboard.png


但願我對回調函數的一點點小總結能對你們有幫助,關於回調函數還有什麼問題能夠在下面留言,一塊兒交流。

相關文章
相關標籤/搜索