2010-08-19 36 views
9

只是一個函數,它在調用它的另一個函數之後執行,完成?新手方法:什麼是JavaScript回調函數?

請問我幾乎沒有任何關於編程的知識,我發現很難找到一個合適的新手答案或解釋這是什麼意思。

我可以請求從stackoverflow大師嘗試?

+1

看看這個答案:http://stackoverflow.com/questions/2070275/javascript-closures-and-callbacks/2070389#2070389 – 2010-08-19 15:56:57

+0

尼斯鏈接非常感謝。 – MEM 2010-08-20 08:10:52

回答

12

通常,一旦您調用完成的其他函數(就像您在您的問題中所述),就會使用回調函數。一個很好的例子就是AJAX請求:大多數庫都有一個函數,允許你在後臺向服務器發送請求而不刷新頁面(這使用AJAX)。您通常爲此AJAX函數提供兩個回調函數:成功函數和失敗函數。

如果此請求成功,它將調用成功函數,以便您的代碼可以執行所需的操作;例如,它可能刷新頁面的一部分,做某種動畫,或提醒用戶他們的信息已保存。另一方面,如果失敗,回調函數可能會提醒用戶他們的數據沒有保存,他們應該再試一次。

回調函數允許庫開發人員創建其他人可以使用的非常通用的代碼,然後根據他們的需求進行自定義。

下面是一些jQuery代碼向你展示以上(如URL不存在這個代碼將無法正常工作)的例子:

jQuery.ajax(
    url: '/mywebsite/somepage.php', 

    success: function itWorked(returnedData) { 
    // This is the success function and will be called only if the ajax call 
    // completes succesfully 

    alert('Yay it worked! ' + returnedData); 
    }, 

    error: function itFailed(originalRequest, textStatus, errorThrown) { 
    // This is the error function and will only be called if the ajax call 
    // has an error 

    alert('It failed! ' + textStatus + '. ' + errorThrown); 
    } 
); 

編輯:在開始的時候,我說,「一般來說...」。實際上,回調的用途遠遠超過功能完成時的情況。正如在其他答案中所述,它可以在函數內的任何位置使用:開始,中間,結束。基本思想是代碼的開發者可能不知道你將如何使用HIS代碼。所以,他使它非常通用,並使您能夠根據數據執行任何您需要的操作。

一個很好的例子是jQuery.each方法,它允許你傳入一個回調函數,這個回調函數將在「數組」中的每個元素上執行(我說數組是因爲它實際上可以迭代許多事情,可能不是實際的陣列)。

<a href='someurl.html' class='special_link'>Some URL</a> 
<a href='anotherurl.html' class='special_link'>Another URL</a> 
<a href='onelasturl.html' class='special_link'>One Last URL</a> 

// The following code says: execute the myEachCallbackFunction on every link 
// that has a class of 'special_link' 
$('a.special_link').each(function myEachCallbackFunction(i) { 

    // The link variable will contain the object that is currently 
    // being iterated over. So, the first time through, it will hold 
    // the 'someurl.html' link, the second time it will hold the 
    // 'anotherurl.html' link, and the last time it will hold the 
    // 'onelasturl.html' link 
    var link = $(this); 

    // Change the background color of each link to be red 
    link.css('background-color', 'red'); 
}); 

因此,我們可以從這個例子看到的jQuery的開發者實現的。每個方法,讓我們可以做任何我們想對每一個環節,它是呼籲。

1

回調函數是在另一個進程結束時自動調用的函數。 它們在異步過程中非常有用,例如獲取頁面。


編輯

例子: 你想使一個Ajax調用(獲取例如網頁)。 當 donwload完成時,你想運行一些函數

使用jQuery,您可以使用此:

$.get('PageIWant.html', myCallBack); 

function myCallBack (data){ 
    alert('I have got the page!'); 
} 
3

回調僅僅是你指定不立即但通常一些事件後調用的函數。這可能類似於ajax請求,您可以指定一個回調,只有在Ajax請求成功完成且不會出錯時纔會調用該回調。另一個例子是當網頁中的DOM準備就緒或窗口加載時的回調。

2

想象一下,你有一些複雜的代碼片段,在它的中間,你必須做「某事」。問題:你不知道什麼「東西」可能是因爲這取決於如何使用代碼。回調救援。

而不是有代碼,你只需在那裏放一個回調。用戶可以提供她自己的一段代碼,它會在恰當的時間執行,以做一些關鍵的事情。例如:jQuery.filter(callback)

jQuery(你應該看看)將爲列表中的每個元素調用callback。回調函數然後可以檢查該元素,並返回true,如果它符合某些條件。

這樣,我們就擁有了兩個最好的世界:jQuery中的聰明人創建了過濾器,並且說出了要查找的內容。

7

回調函數是「對可執行代碼或一段可執行代碼的引用,它是作爲參數傳遞給其他代碼的。」

這裏是一個很好的文章,以幫助瞭解什麼是"callback" function.

+1

+1我相信這將是最完整,正確和簡單的答覆。就是這樣。 – Trace 2013-07-13 13:45:20

0

試圖獲得更普遍和簡單的例子,我想通了以下內容,與參數performe計算有兩個數字:x和y 。

function doMath (x,y,myMath) {return myMath(x,y);} 

function mult (a,b){return a*b;} 
function sum (a,b){return a+b;} 

alert(doMath(2,2,sum))  

其中myMath是回調函數。我可以將其替換爲我想要的任何功能。

0

這樣的代碼

var result = db.query('select * from T'); //use result - Standard function 

你的軟件是什麼都不做,你只是在等待數據庫響應。這無論如何要麼阻止整個過程,要麼隱含多個執行堆棧。但是這樣的一行代碼

db.query('select * from T',function(result){ 
    //use result - Callback function 
}); 

允許程序立即返回到事件循環。

在此執行,服務器使得該請求,並繼續做其他 的事情,當請求回來(百萬個時鐘週期之後), 可以執行回調,所有你需要的是指針 回電話。

相關問題