在JavaScript中,回調函數具體的定義爲:函數A做爲參數(函數引用)傳遞到另外一個函數B中,而且這個函數B執行函數A。咱們就說函數A叫作回調函數。若是沒有名稱(函數表達式),就叫作匿名回調函數。javascript
所以callback 不必定用於異步,通常同步(阻塞)的場景下也常常用到回調,好比要求執行某些操做後執行回調函數。php
一個同步(阻塞)中使用回調的例子,目的是在func1代碼執行完成後執行func2。html
var func1=function(callback){
//do something.
(callback && typeof(callback) === "function") && callback();
}
func1(func2);
var func2=function(){
}複製代碼
異步回調的例子:java
$(document).ready(callback);
$.ajax({
url: "test.html",
context: document.body
}).done(function() {
$(this).addClass("done");
}).fail(function() { alert("error");
}).always(function() { alert("complete");
});
/** 注意的是,ajax請求確實是異步的,不過這請求是由瀏覽器新開一個線程請求,當請求的狀態變動時,若是先前已設置回調,這異步線程就產生狀態變動事件放到 JavaScript引擎的處理隊列中等待處理。見:http://www.phpv.net/html/1700.html */複製代碼
回調函數,通常在同步情境下是最後執行的,而在異步情境下有可能不執行,由於事件沒有被觸發或者條件不知足。ajax
上面說了,要將函數引用或者函數表達式做爲參數傳遞。typescript
$.get('myhtmlpage.html', myCallBack);//這是對的
$.get('myhtmlpage.html', myCallBack('foo', 'bar'));//這是錯的,那麼要帶參數呢?
$.get('myhtmlpage.html', function(){//帶參數的使用函數表達式
myCallBack('foo', 'bar');
});複製代碼
另外,最好保證回調存在且必須是函數引用或者函數表達式:
(callback && typeof(callback) === "function") && callback();瀏覽器