2012-05-21 116 views
3

我一直在用不同的語言編程。最近,我有機會開始知道jQuery。我正在閱讀關於回調函數的內容,我理解它的含義(以一種特定的方式,一個接一個地執行)。我有點困惑,要麼將它們與嵌套函數聯繫起來?這不是一回事嗎?請幫忙清除這個概念。謝謝。回調函數是否與嵌套函數相同?

回答

4

回調函數是在操作完成時調用的任何函數。這其實並不重要,它的定義:你可以創建一個局部範圍的功能,全局範圍等

使用$.ajax爲例,其中success是回調:

function handleSuccess(data) { 
    $(document.body).append(data); 
} 

function doAjaxCall() { 
    $.ajax({url: 'some/path', success: handleSuccess }); 
} 

在功能等效於:

function doAjaxCall() { 
    var handleSuccess = function(data) { 
     $(document.body).append(data); 
    } 

    $.ajax({ url: 'some/path', success: handleSuccess }); 
} 

在功能上等同於:

function doAjaxCall() { 
    $.ajax({ url: 'some/path', success: function(data) { 
     $(document.body).append(data); 
    } 
    }); 
} 
1

回調函數只是一個執行回調的函數。 :)所以首先你需要打電話,這實際上是任何操作。考慮這個例子:

$.ajax({ 
    url: '/test/' 
}); 

此方法調用我們的服務器。現在操作是異步的 - 我們不知道服務器什麼時候會響應。但是我們知道它會給我們提供什麼樣的數據。所以你定義了回調 - 你將在服務器響應之後執行的操作。在這種情況下,您可以定義success回調:

$.ajax({ 
    url: '/test/', 
    success: function(res) { 
     console.log(res); 
    } 
}); 

回調不需要是異步的。考慮下面這個例子

function test(data, callback) { 
    if (callback && $.isFunction(callback)) 
     callback(data); 
} 

jQuery的方法isFunction僅檢查是否callback是一個函數。現在,您可以撥打test這樣

test('test_string', function(str) { 
    console.log(str); 
}); 

傳遞的功能,作爲第二個參數是一個回調。

所以基本上回調是沒有別的然後一個函數作爲參數傳遞給另一個函數。主要用於異步操作,但不僅僅是(生活示例:Array對象的方法forEach)。

1

糾正我,如果我錯了,但我認爲這個問題是:

$("#someDiv").fadeIn(200, function(){ 
     //do some stuff 
    }); 

vs 

$("#someDiv").fadeIn(200, callbackFunction); 
function callbackFunction() 
{ 
    //do some stuff 
} 

(對不起張貼這是一個答案不評論,但評論沒有代碼格式化)

+0

其實,意見(反引號之間:) :) – dezso

+0

嗯......不是真的:'$(「#someDiv」)。fadeIn(200,function(){ //做一些東西 }); vs $(「#someDiv」)。fadeIn(200,callbackFunction); function callbackFunction() { // do do stuff } ' – strah