2016-02-12 76 views
2

我對下面的代碼有點困惑。我不明白的部分是結果參數如何等於callback(x+y)的結果。有人可以解釋這一點,也許這是執行步驟的順序?瞭解具有參數的回調

function add(x,y, callback){ 
    callback(x+y) 
} 

add(3,4, function(result){ 
    console.log(result) //logs out 7 
}) 

我知道3 + 4是7,但我沒有明確理解結果參數如何獲得這個7值。

+1

這是一個函數參數,就像任何其他函數參數一樣。將'3'作爲'x'並沒有什麼不同。 – SLaks

回答

1

大問題,一旦你明白這一點,它會在打開很多門的JavaScript。

讓我們看不回調會發生什麼:

function add(x, y) { 
    return x + y; 
} 

add(1, 2) // returns 3 

當你return x + y,那就是你從功能回來。

現在我們來介紹一個新功能,但不是回調。

function add(x, y) { 
    return x + y; 
} 

function logResult(result) { 
    console.log(result) 
} 

var result = add(1, 2) // 3 
logResult(result) // outputs "3" 

正如你看到的,我們稱之爲add,得到的結果,然後將其傳遞到logResult,它輸出到控制檯。

如果我們在add第三個參數傳遞logResult作爲一個函數,然後我們與result調用它裏面add,它有效地是同樣的事情!

function add(x, y, callback) { 
    var result = x + y; 

    // we're calling the function that gets passed in 
    // which is `logResult` 
    callback(result) 
} 

function logResult(result) { 
    console.log(result) 
} 

add(x, y, logResult) // outputs "3" 

現在我們轉回到你的榜樣,從而降低了一切所需的最少代碼:

function add(x, y, cb) { 
    cb(x + y); 
} 

add(1, 2, function (result) { 
    console.log(result) 
}); // outputs "3" 

在JS你可以通過功能集成到其它功能。接收另一個函數作爲參數的函數可以調用它。這就是你在這裏。您還可以進一步減少這樣的:

function add(x, y, cb) { 
    cb(x + y) 
} 

add(1, 2, console.log) // outputs "3" 
add(1, 2, console.error) // outputs "3" in error format 
+1

而當你告訴他一個函數可以返回一個函數時,他的腦袋就會崩潰! :) –

+1

謝謝你的偉大的解釋。現在我知道更多! – user1142130

0

add函數調用這些參數:

x = 3 
y = 4 
callback = function(result) { console.log(result) } 

該函數總結x+y。這產生7

然後調用callback功能有這樣的說法:

result = 7 

這個函數日誌7在控制檯

0

此代碼:

function add(x,y, callback){ 
    callback(x+y) 
} 

add(3,4, function(result){ 
    console.log(result) //logs out 7 
}) 

是完全一樣的:

function add(x,y, callback){ 
    callback(x+y); 
} 

function output(result){ 
    console.log(result); 
} 

add(3,4, output); 

因此函數添加需要3個參數,調用add(3,4,output)時,

  1. 的參數x被分配的參數y被賦值爲4
  2. 參數callback被分配的指針功能output

由於在上面的呼叫callback3

  • 是一個指針,指向功能output,當你做callback(x+y)你實際上是撥打output(3+4)

    沒什麼特別的。這只是javascript處理函數作爲第一類值的結果。