日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

理解javascript中的回调函数(callback)【转】

發(fā)布時間:2025/3/21 javascript 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 理解javascript中的回调函数(callback)【转】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
在JavaScrip中,function是內(nèi)置的類對象,也就是說它是一種類型的對象,可以和其它String、Array、Number、Object類的對象一樣用于內(nèi)置對象的管理。因?yàn)閒unction實(shí)際上是一種對象,它可以“存儲在變量中,通過參數(shù)傳遞給(別一個)函數(shù)(function),在函數(shù)內(nèi)部創(chuàng)建,從函數(shù)中返回結(jié)果值”。 因?yàn)閒unction是內(nèi)置對象,我們可以將它作為參數(shù)傳遞給另一個函數(shù),延遲到函數(shù)中執(zhí)行,甚至執(zhí)行后將它返回。這是在JavaScript中使用回調(diào)函數(shù)的精髓。本篇文章的剩余部分將全面學(xué)習(xí)JavaScript的回調(diào)函數(shù)。回調(diào)函數(shù)也許是JavaScript中使用最廣泛的功能性編程技術(shù),也許僅僅一小段JavaScript或jQuery的代碼都會給開發(fā)者留下一種神秘感,閱讀這篇文章后,也許會幫你消除這種神秘感。

?

回調(diào)函數(shù)來自一種著名的編程范式——函數(shù)式編程,在基本層面上,函數(shù)式編程指定的了函數(shù)的參數(shù)。函數(shù)式編程雖然現(xiàn)在的使用范圍變小了,但它一直被“專業(yè)的聰明的”程序員看作是一種難懂的技術(shù),以前是這樣,未來也將是如此。

幸運(yùn)的是,函數(shù)式編程已經(jīng)被闡述的像你我這樣的一般人也能理解和使用。函數(shù)式編程最主要的技術(shù)之一就是回調(diào)函數(shù),你很快會閱讀到,實(shí)現(xiàn)回調(diào)函數(shù)就像傳遞一般的參數(shù)變量一樣簡單。這項(xiàng)技術(shù)如此的簡單,以至于我都懷疑為什么它經(jīng)常被包含在JavaScript的高級話題中去。

什么是回調(diào)或高級函數(shù)?

回調(diào)函數(shù)被認(rèn)為是一種高級函數(shù),一種被作為參數(shù)傳遞給另一個函數(shù)(在這稱作"otherFunction")的高級函數(shù),回調(diào)函數(shù)會在otherFunction內(nèi)被調(diào)用(或執(zhí)行)。回調(diào)函數(shù)的本質(zhì)是一種模式(一種解決常見問題的模式),因此回調(diào)函數(shù)也被稱為回調(diào)模式。

思考一下下面這種在jQuery中常用的回調(diào)函數(shù): //Note that the item in the click method's parameter is a function, not a variable. //The item is a callback function $("#btn_1").click(function() {alert("Btn 1 Clicked"); });

正如在前面的例子所看到的,我們傳遞了一個函數(shù)給click方法的形參,click方法將會調(diào)用(或執(zhí)行)我們傳遞給它的回調(diào)函數(shù)。這個例子就給出了JavaScript中使用回調(diào)函數(shù)的一個典型方式,并廣泛應(yīng)用于jQuery中。

細(xì)細(xì)體味一下另一個基本JavaScript的典型例子:

var friends = ["Mike", "Stacy", "Andy", "Rick"];friends.forEach(function (eachName, index){ console.log(index + 1 + ". " + eachName); // 1. Mike, 2. Stacy, 3. Andy, 4. Rick });

我們再一次用同樣的方式傳遞了一個匿名的函數(shù)(沒有函數(shù)名的函數(shù))給forEach方法,作為forEach的參數(shù)。

到目前為止,我們傳遞了一個匿名的函數(shù)作為參數(shù)給另一個函數(shù)或方法。在看其它更復(fù)雜的回調(diào)函數(shù)之前,讓我們理解一下回調(diào)的工作原理并實(shí)現(xiàn)一個自己的回調(diào)函數(shù)。

回調(diào)函數(shù)是如何實(shí)現(xiàn)的?

我們可以像使用變量一樣使用函數(shù),作為另一個函數(shù)的參數(shù),在另一個函數(shù)中作為返回結(jié)果,在另一個函數(shù)中調(diào)用它。當(dāng)我們作為參數(shù)傳遞一個回調(diào)函數(shù)給另一個函數(shù)時,我們只傳遞了這個函數(shù)的定義,并沒有在參數(shù)中執(zhí)行它。

當(dāng)包含(調(diào)用)函數(shù)擁有了在參數(shù)中定義的回調(diào)函數(shù)后,它可以在任何時候調(diào)用(也就是回調(diào))它。

這說明回調(diào)函數(shù)并不是立即執(zhí)行,而是在包含函數(shù)的函數(shù)體內(nèi)指定的位置“回調(diào)”它(形如其名)。所以,即使第一個jQuery的例子看起來是這樣:

//The anonymous function is not being executed there in the parameter. //The item is a callback function $("#btn_1").click(function() {alert("Btn 1 Clicked"); });

匿名函數(shù)將延遲在click函數(shù)的函數(shù)體內(nèi)被調(diào)用,即使沒有名稱,也可以被包含函數(shù)通過?arguments對象訪問。

回調(diào)函數(shù)是閉包的
當(dāng)作為參數(shù)傳遞一個回調(diào)函數(shù)給另一個函數(shù)時,回調(diào)函數(shù)將在包含函數(shù)函數(shù)體內(nèi)的某個位置被執(zhí)行,就像回調(diào)函數(shù)在包含函數(shù)的函數(shù)體內(nèi)定義一樣。這意味著回調(diào)函數(shù)是閉包的,想更多地了解閉包,請參考作者另一個貼子Understand JavaScript Closures With Ease。從所周知,閉包函數(shù)可以訪問包含函數(shù)的作用域,所以,回調(diào)函數(shù)可以訪問包含函數(shù)的變量,甚至是全局變量。

實(shí)現(xiàn)回調(diào)函數(shù)的基本原則

簡單地說,自己實(shí)現(xiàn)回調(diào)函數(shù)的時候需要遵循幾條原則。

使用命名函數(shù)或匿名函數(shù)作為回調(diào)
在前面的jQuery和forEach的例子中,我們在包含函數(shù)的參數(shù)中定義匿名函數(shù),這是使用回調(diào)函數(shù)的通用形式之一,另一個經(jīng)常被使用的形式是定義一個帶名稱的函數(shù),并將函數(shù)名作為參數(shù)傳遞給另一個函數(shù),例如:

?// global variable var allUserData = [];// generic logStuff function that prints to console function logStuff (userData) {if ( typeof userData === "string"){console.log(userData);}else if ( typeof userData === "object"){for (var item in userData) {console.log(item + ": " + userData[item]);}}}// A function that takes two parameters, the last one a callback function function getInput (options, callback) {allUserData.push (options);callback (options);}// When we call the getInput function, we pass logStuff as a parameter. // So logStuff will be the function that will called back (or executed) inside the getInput function getInput ({name:"Rich", speciality:"JavaScript"}, logStuff); // name: Rich // speciality: JavaScript

傳遞參數(shù)給回調(diào)函數(shù)
因?yàn)榛卣{(diào)函數(shù)在執(zhí)行的時候就和一般函數(shù)一樣,我們可以傳遞參數(shù)給它。可以將包含函數(shù)的任何屬性(或全局的屬性)作為參數(shù)傳遞回調(diào)函數(shù)。在上一個例子中,我們將包含函數(shù)的options作為參數(shù)傳遞給回調(diào)函數(shù)。下面的例子讓我們傳遞一個全局變量或本地變量給回調(diào)函數(shù):

//Global variable var generalLastName = "Clinton";function getInput (options, callback) {allUserData.push (options); // Pass the global variable generalLastName to the callback functioncallback (generalLastName, options); }

在執(zhí)行之前確保回調(diào)是一個函數(shù)
在調(diào)用之前,確保通過參數(shù)傳遞進(jìn)來的回調(diào)是一個需要的函數(shù)通常是明智的。此外,讓回調(diào)函數(shù)是可選的也是一個好的實(shí)踐。

讓我們重構(gòu)一下上面例子中的getInput函數(shù),確保回調(diào)函數(shù)做了適當(dāng)?shù)臋z查。

function getInput(options, callback) {allUserData.push(options);// Make sure the callback is a functionif (typeof callback === "function") {// Call it, since we have confirmed it is callablecallback(options);} }

如果getInput函數(shù)沒有做適當(dāng)?shù)臋z查(檢查callback是否是函數(shù),或是否通過參數(shù)傳遞進(jìn)來了),我們的代碼將會導(dǎo)致運(yùn)行時錯誤。

使用含有this對象的回調(diào)函數(shù)的問題
當(dāng)回調(diào)函數(shù)是一個含有this對象的方法時,我們必須修改執(zhí)行回調(diào)函數(shù)的方法以保護(hù)this對象的內(nèi)容。否則this對象將會指向全局的window對象(如果回調(diào)函數(shù)傳遞給了全局函數(shù)),或指向包含函數(shù)。讓我們看看下面的代碼:

// Define an object with some properties and a method // We will later pass the method as a callback function to another function var clientData = {id: 094545,fullName: "Not Set",// setUserName is a method on the clientData objectsetUserName: function (firstName, lastName) {// this refers to the fullName property in this objectthis.fullName = firstName + " " + lastName;} }function getUserInput(firstName, lastName, callback) {// Do other stuff to validate firstName/lastName here// Now save the namescallback (firstName, lastName); }

在下面的示例代碼中,當(dāng)clientData.setUserName被執(zhí)行時,this.fullName不會設(shè)置clientData?對象中的屬性fullName,而是設(shè)置window?對象中的fullName,因?yàn)間etUserInput是一個全局函數(shù)。出現(xiàn)這種現(xiàn)象是因?yàn)樵谌趾瘮?shù)中this對象指向了window對象。

getUserInput ("Barack", "Obama", clientData.setUserName);console.log (clientData.fullName);// Not Set// The fullName property was initialized on the window object console.log (window.fullName); // Barack Obama

使用Call或Apply函數(shù)保護(hù)this對象

我們可以通過使用?Call?或?Apply函數(shù)來解決前面示例中的問題。到目前為止,我們知道JavaScript中的每一個函數(shù)都有兩個方法:Call和Apply。這些方法可以被用來在函數(shù)內(nèi)部設(shè)置this對象的內(nèi)容,并內(nèi)容傳遞給函數(shù)參數(shù)指向的對象。

Call?takes the value to be used as the?this?object inside the function as the first parameter, and the remaining arguments to be passed to the function are passed individually (separated by commas of course). The?Apply?function’s first parameter is also the value to be used as the?thisobject inside the function, while the last parameter is an array of values (or the?arguments?object) to pass to the function. ?(該段翻譯起來太拗口了,放原文自己體會)

這聽起來很復(fù)雜,但讓我們看看Apply和Call的使用是多么容易。為解決前面例子中出現(xiàn)的問題,我們使用Apply函數(shù)如下:

//Note that we have added an extra parameter for the callback object, called "callbackObj" function getUserInput(firstName, lastName, callback, callbackObj) {// Do other stuff to validate name here// The use of the Apply function below will set the this object to be callbackObjcallback.apply (callbackObj, [firstName, lastName]); }

通過Apply函數(shù)正確地設(shè)置this對象,現(xiàn)在我們可以正確地執(zhí)行回調(diào)函數(shù)并它正確地設(shè)置clientData對象中的fullName屬性。

// We pass the clientData.setUserName method and the clientData object as parameters. The clientData object will be used by the Apply function to set the this objectgetUserInput ("Barack", "Obama", clientData.setUserName, clientData);// the fullName property on the clientData was correctly set console.log (clientData.fullName); // Barack Obama

我們也可以使用Call?函數(shù),但在本例中我們使用的Apply?函數(shù)。

多重回調(diào)函數(shù)也是允許的
我們可以傳遞多個回調(diào)函數(shù)給另一個函數(shù),就像傳遞多個變量一樣。這是使用jQuery的AJAX函數(shù)的典型例子:

function successCallback() {// Do stuff before send }function successCallback() {// Do stuff if success message received }function completeCallback() {// Do stuff upon completion }function errorCallback() {// Do stuff if error received }$.ajax({url:"http://fiddle.jshell.net/favicon.png",success:successCallback,complete:completeCallback,error:errorCallback});

“回調(diào)地獄”的問題和解決方案

異步代碼執(zhí)行是一種簡單的以任意順序執(zhí)行的方式,有時是很常見的有很多層級的回調(diào)函數(shù),你看起來像下面這樣的代碼。下面這種凌亂的代碼稱作“回調(diào)地獄”,因?yàn)樗且环N包含非常多的回調(diào)的麻煩的代碼。我是在node-MongoDB-native里看到這個例子的,MongoDB驅(qū)動Node.js.示例代碼就像這樣:

var p_client = new Db('integration_tests_20', new Server("127.0.0.1", 27017, {}), {'pk':CustomPKFactory}); p_client.open(function(err, p_client) {p_client.dropDatabase(function(err, done) {p_client.createCollection('test_custom_key', function(err, collection) {collection.insert({'a':1}, function(err, docs) {collection.find({'_id':new ObjectID("aaaaaaaaaaaa")}, function(err, cursor) {cursor.toArray(function(err, items) {test.assertEquals(1, items.length);// Let's close the dbp_client.close();});});});});}); });

你不太可能在自己的代碼里碰到這個的問題,但如果你碰到了(或以后偶然碰到了),那么有以下兩種方式解決這個問題。

  • 命名并定義你的函數(shù),然后傳遞函數(shù)名作為回調(diào),而不是在主函數(shù)的參數(shù)列表里定義一個匿名函數(shù)。
  • 模塊化:把你的代碼劃分成一個個模塊,這樣你可以空出一部分代碼塊做特殊的工作。然后你可以將這個模型引入到你的大型應(yīng)用程序中。

    ??

  • 實(shí)現(xiàn)自己的回調(diào)函數(shù)

    現(xiàn)在你已經(jīng)完全理解(我相信你已經(jīng)理解了,如果沒有請快速重新閱讀一遍)了JavaScript關(guān)于回調(diào)的所用特性并且看到回調(diào)的使用是如此簡單但功能卻很強(qiáng)大。你應(yīng)該看看自己的代碼是否有機(jī)會使用回調(diào)函數(shù),有以下需求時你可以考慮使用回調(diào):

    • 避免重復(fù)代碼?(DRY—Do Not Repeat Yourself)
    • 在你需要更多的通用功能的地方更好地實(shí)現(xiàn)抽象(可處理各種類型的函數(shù))。
    • 增強(qiáng)代碼的可維護(hù)性
    • 增強(qiáng)代碼的可讀性
    • 有更多定制的功能

    實(shí)現(xiàn)自己的回調(diào)函數(shù)很簡單,在下面的例子中,我可以創(chuàng)建一個函數(shù)完成所用的工作:獲取用戶數(shù)據(jù),使用用戶數(shù)據(jù)生成一首通用的詩,使用用戶數(shù)據(jù)來歡迎用戶,但這個函數(shù)將會是一個凌亂的函數(shù),到處是if/else的判斷,甚至?xí)泻芏嗟南拗撇o法執(zhí)行應(yīng)用程序可能需要的處理用戶數(shù)據(jù)的其它函數(shù)。

    替而代之的是我讓實(shí)現(xiàn)增加了回調(diào)函數(shù),這樣主函數(shù)獲取用戶數(shù)據(jù)后可以傳遞用戶全名和性別給回調(diào)函數(shù)的參數(shù)并執(zhí)行回調(diào)函數(shù)以完成任何任務(wù)。

    簡而言之,getUserInput函數(shù)是通用的,它可以執(zhí)行多個擁有各種功能的回調(diào)函數(shù)。

    // First, setup the generic poem creator function; it will be the callback function in the getUserInput function below. function genericPoemMaker(name, gender) {console.log(name + " is finer than fine wine.");console.log("Altruistic and noble for the modern time.");console.log("Always admirably adorned with the latest style.");console.log("A " + gender + " of unfortunate tragedies who still manages a perpetual smile"); }//The callback, which is the last item in the parameter, will be our genericPoemMaker function we defined above. function getUserInput(firstName, lastName, gender, callback) {var fullName = firstName + " " + lastName;// Make sure the callback is a functionif (typeof callback === "function") {// Execute the callback function and pass the parameters to itcallback(fullName, gender);} }

    調(diào)用getUserInput函數(shù)并傳遞genericPoemMaker函數(shù)作為回調(diào):

    getUserInput("Michael", "Fassbender", "Man", genericPoemMaker); // Output /* Michael Fassbender is finer than fine wine. Altruistic and noble for the modern time. Always admirably adorned with the latest style. A Man of unfortunate tragedies who still manages a perpetual smile. */

    因?yàn)間etUserInput?函數(shù)只處理用戶數(shù)據(jù)的輸入,我們可以傳遞任何回調(diào)函數(shù)給它。例如我們可以像這樣傳遞一個greetUser函數(shù)。

    function greetUser(customerName, sex) {var salutation = sex && sex === "Man" ? "Mr." : "Ms.";console.log("Hello, " + salutation + " " + customerName); }// Pass the greetUser function as a callback to getUserInput getUserInput("Bill", "Gates", "Man", greetUser);// And this is the output Hello, Mr. Bill Gates

    和上一個例子一樣,我們調(diào)用了同一個getUserInput?函數(shù),但這次卻執(zhí)行了完全不同的任務(wù)。

    如你所見,回調(diào)函數(shù)提供了廣泛的功能。盡管前面提到的例子非常簡單,在你開始使用回調(diào)函數(shù)的時候思考一下你可以節(jié)省多少工作,如何更好地抽象你的代碼。加油吧!在早上起來時想一想,在晚上睡覺前想一想,在你休息時想一想……

    我們在JavaScript中經(jīng)常使用回調(diào)函數(shù)時注意以下幾點(diǎn),尤其是現(xiàn)在的web應(yīng)用開發(fā),在第三方庫和框架中

    • 異步執(zhí)行(例如讀文件,發(fā)送HTTP請求)
    • 事件監(jiān)聽和處理
    • 設(shè)置超時和時間間隔的方法
    • 通用化:代碼簡潔?

    ?

    這篇文章主要介紹了理解javascript中的回調(diào)函數(shù)(callback),本文著重于對回調(diào)函數(shù)概念的理解,需要的朋友可以參考下

    最近在看 express,滿眼看去,到處是以函數(shù)作為參數(shù)的回調(diào)函數(shù)的使用。如果這個概念理解不了,nodejs、express 的代碼就會看得一塌糊涂。比如:

    復(fù)制代碼代碼如下:
    app.use(function(req, res, next) {
    ??? var err = new Error('Not Found');
    ??? err.status = 404;
    ??? next(err);
    });
    app是對象,use是方法,方法的參數(shù)是一個帶參的匿名函數(shù),函數(shù)體直接在后面給出了。這段代碼怎么理解呢?我們先來了解回調(diào)函數(shù)這個概念。
    首先要了解,在 js 中,函數(shù)也是對象,可以賦值給變量,可以作為參數(shù)放在函數(shù)的參數(shù)列表中。比如:
    復(fù)制代碼代碼如下:
    var doSomething = function(a,b)
    {
    ?return a + b;
    }
    這段代碼的意思是定義一個匿名函數(shù),這個匿名函數(shù)除了沒有名字之外,其他跟普通的函數(shù)沒有什么兩樣。然后把匿名函數(shù)賦值給變量doSomething。接下來我們調(diào)用:
    復(fù)制代碼代碼如下:
    console.log(doSomething(2,3));

    ?

    這樣會輸出5。

    回調(diào)函數(shù),就是放在另外一個函數(shù)(如 parent)的參數(shù)列表中,作為參數(shù)傳遞給這個 parent,然后在 parent 函數(shù)體的某個位置執(zhí)行。說來抽象,看例子:

    復(fù)制代碼代碼如下:
    // To illustrate the concept of callback
    var doit = function(callback)
    {
    ??? var a = 1,
    ??????? b = 2,
    ??????? c = 3;
    ??? var t = callback(a,b,c);
    ??? return t + 10;
    };
    var d = doit(function(x,y,z){
    ??? return (x+y+z);
    });
    console.log(d);
    先定義 doit 函數(shù),有一個參數(shù) callback。這個 callback 就是回調(diào)函數(shù),名字可以任意取。看函數(shù)體,先定義三個變量 a,b,c。然后調(diào)用 callback 函數(shù)。最后返回一個值。

    ?

    下面就調(diào)用 doit 函數(shù)了。要注意的是,剛才定義 doit 時,callback 并沒有定義,所以剛才并不知道 callback 是干什么用的。這其實(shí)很好理解,我們平時定義函數(shù)的時候,參數(shù)也只是給出了一個名字,比如 a,在函數(shù)體中使用 a,但整個過程也并不知道 a 到底是什么,只有在調(diào)用那個函數(shù)的時候才指定 a 的具體值,比如2.回過頭來,在調(diào)用 doit 的時候,我們就需要指定 callback 究竟是個什么東西了。可以看到,這個函數(shù)完成了一個 sum 功能。

    上述代碼的執(zhí)行過程是:

    調(diào)用 doit函數(shù),參數(shù)是一個匿名函數(shù);進(jìn)入 doit 的函數(shù)體中,先定義 a,b,c,然后執(zhí)行剛才的匿名函數(shù),參數(shù)是 a,b,c,并返回一個 t,最后返回一個 t+10給 d。

    回到最初的例子,app.use(...)是函數(shù)調(diào)用。我們可以想象,之前一定定義了一個 use 方法,只是這里沒有給出。這兩個例子一對比,就可以馬上理解了。

    在使用nodejs、express 的時候,不可能每個方法或函數(shù)我們都要找到它的函數(shù)定義去看一看。所以只要知道那個定義里面給 callback 傳遞了什么參數(shù)就行了。然后在調(diào)用方法或函數(shù)時,在參數(shù)里我們自己定義匿名函數(shù)來完成某些功能。

    Over!

    ?

    ?


    Javascript中的Callback方法淺析

    投稿:junjie 字體:[增加?減小] 類型:轉(zhuǎn)載 時間:2015-03-15?我要評論

    這篇文章主要介紹了Javascript中的Callback方法淺析,本文講解了什么是callback、Javscript Callback、Callback是什么、Callback實(shí)例等內(nèi)容,需要的朋友可以參考下

    什么是callback


    ?回調(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),當(dāng)這個指針被用為調(diào)用它所指向的函數(shù)時,我們就說這是回調(diào)函數(shù)。回調(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時由另外的一方調(diào)用的,用于對該事件或條件進(jìn)行響應(yīng)。

    ?

    這個解釋看上去很復(fù)雜,于是找到了知乎上一個更好的解釋

    ?


    ?你到一個商店買東西,剛好你要的東西沒有貨,于是你在店員那里留下了你的電話,過了幾天店里有貨了,店員就打了你的電話,然后你接到電話后就到店里去取了貨。在這個例子里,你的電話號碼就叫回調(diào)函數(shù),你把電話留給店員就叫登記回調(diào)函數(shù),店里后來有貨了叫做觸發(fā)了回調(diào)關(guān)聯(lián)的事件,店員給你打電話叫做調(diào)用回調(diào)函數(shù),你到店里去取貨叫做響應(yīng)回調(diào)事件。回答完畢。

    ?

    在Javascript中:

    ?


    ?函數(shù)A作為參數(shù)(函數(shù)引用)傳遞到另一個函數(shù)B中,并且這個函數(shù)B執(zhí)行函數(shù)A。我們就說函數(shù)A叫做回調(diào)函數(shù)。如果沒有名稱(函數(shù)表達(dá)式),就叫做匿名回調(diào)函數(shù)。
    實(shí)際上,也就是把函數(shù)作為參數(shù)傳遞。

    ?

    Javscript Callback

    把上面那些復(fù)雜的解釋都丟到垃圾桶里吧~,看看Callback是什么

    Callback是什么

    在jQuery中, hide的方法大概是這樣子的


    $(selector).hide(speed,callback)


    $('#element').hide(1000, function() {
    ??? // callback function
    });
    我們只需要在里面寫一個簡單的函數(shù)
    復(fù)制代碼代碼如下:
    $('#element').hide(1000, function() {
    ??? console.log('Hide');
    });
    有一個小小的注釋在這其中:Callback 函數(shù)在當(dāng)前動畫 100% 完成之后執(zhí)行。然后我們就可以看到真正的現(xiàn)象,當(dāng)id為element的元素隱藏后,會在console中輸出Hide。

    ?

    就也就意味著:

    Callback實(shí)際上是,當(dāng)一個函數(shù)執(zhí)行完后,現(xiàn)執(zhí)行的那個函數(shù)就是所謂的callback函數(shù)。

    Callback作用

    正常情況下函數(shù)都是按順序執(zhí)行的,然而Javascript是一個事件驅(qū)動的語言。


    function hello(){
    ??? console.log('hello');
    }

    ?

    function world(){
    ??? console.log('world');
    }

    hello();
    world();


    所以正常情況下都會按順序執(zhí)行的,然而當(dāng)執(zhí)行world事件的時間比較長時。
    function hello(){
    ??? setTimeout( function(){
    ??????? console.log( 'hello' );
    ??? }, 1000 );
    }

    ?

    function world(){
    ??? console.log('world');
    }

    hello();
    world();


    那么這個時候就不是這樣的,這時會輸出world,再輸出hello,故而我們需要callback。

    ?

    Callback實(shí)例

    一個簡單地例子如下

    定義:
    function add_callback(p1, p2 ,callback) {
    ??? var my_number = p1 + p2;
    ??? callback(my_number);
    }

    ?調(diào)用:

    add_callback(5, 15, function(num){
    ??? console.log("call " + num);
    });


    在例子中我們有一個add_callback的函數(shù),接收三個參數(shù):前兩個是要相加的兩個參數(shù),第三個參數(shù)是回調(diào)函數(shù)。當(dāng)函數(shù)執(zhí)行時,返回相加結(jié)果,并在控制臺中輸出'call 20'。

    總結(jié)

    以上是生活随笔為你收集整理的理解javascript中的回调函数(callback)【转】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。