首頁  >  文章  >  web前端  >  理解javascript中的回呼函數(callback)_javascript技巧

理解javascript中的回呼函數(callback)_javascript技巧

WBOY
WBOY原創
2016-05-16 16:37:551232瀏覽

最近在看 express,滿眼看去,到處是以函數作為參數的回調函數的使用。如果這個概念理解不了,nodejs、express 的程式碼就會看得一塌糊塗。如:

複製程式碼 程式碼如下:

app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

app是對象,use是方法,方法的參數是一個帶參的匿名函數,函數體直接在後面給了。這段程式碼怎麼理解呢?我們先來了解回呼函數這個概念。
首先要了解,在 js 中,函數也是對象,可以賦值給變量,可以放在函數的參數列表中。如:
複製程式碼 程式碼如下:

var doSomething = function(a,b)
{
 return a b;
}

這段程式碼的意思是定義一個匿名函數,這個匿名函數除了沒有名字之外,其他跟普通的函數沒有什麼兩樣。然後把匿名函數賦值給變數doSomething。接下來我們呼叫:
複製程式碼 程式碼如下:

console.log(doSomething(2,3));

這樣會輸出5。

回呼函數,就是放在另一個函數(如 parent)的參數清單中,作為參數傳遞給這個 parent,然後在 parent 函數體的某個位置執行。說來抽象,看例子:

複製程式碼 程式碼如下:

// 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 函數,有一個參數 callback。這個 callback 就是回呼函數,名字可以任意取用。看函數體,先定義三個變數 a,b,c。然後呼叫 callback 函數。最後傳回一個值。

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

上述程式碼的執行過程是:

呼叫doit函數,參數是一個匿名函數;進入doit 的函數體中,先定義a,b,c,然後執行剛才的匿名函數,參數是a,b,c,並傳回一個t,最後返回一t 10給d。

回到最初的例子,app.use(...)是函數呼叫。我們可以想像,之前一定定義了一個 use 方法,只是這裡沒有給。這兩個例子一對比,就可以馬上理解了。

在使用nodejs、express 的時候,不可能每個方法或函數我們都要找到它的函數定義去看一看。所以只要知道那個定義裡面傳遞了什麼參數給 callback 就行了。然後在呼叫方法或函數時,在參數裡我們自己定義匿名函數來完成某些功能。

Over!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn