2015-11-21 200 views
1

我想了解JS和我真的很困惑的回調模式。回調函數vs從函數內部調用函數

function one(){ 
    alert("I'm one!") 
} 

function total(arg, callback){ 
    setTimeout(function() {alert("I'm "+arg);}, 1000); 
    callback(); 
} 

total('all', one); 

function one(){ 
    alert("I'm one!") 
} 

function total(arg){ 
    setTimeout(function() {alert("I'm "+arg);}, 1000); 
    one(); 
} 

total('all'); 

什麼是傳遞one()作爲參數VS從函數中只調用它的好處?

+1

它基本上是同樣的事情。回調使得該方法可以與其他事物一起重用。 – epascarello

+1

http://stackoverflow.com/questions/9596276/how-to-explain-callbacks-in-plain-english-how-are-they-different-from-calling-o – epascarello

回答

0

我懷疑你的例子不是爲了展示回調是什麼。這是否更有意義?

function cb(arg){ 
    alert("I'm "+arg+"!") 
} 

function total(arg, callback){ 
    setTimeout(callback, 1000, arg); 
} 

total('one', cb); 
3

如果您知道您總是打電話給one,則無需將其作爲輸入參數接受;你可以直接打電話給它。

接受回調的能力可讓您輕鬆編寫鬆散耦合的代碼。

例如,您在代碼示例中將回調傳遞給setTimeoutsetTimeout知道在函數被調用之前等待給定的毫秒數,但它不知道要調用哪個函數。

+0

完全同意@ david-hedlund - 主要想法是你可能想要一個通用函數'total',它可以接受任何函數並在'total'內執行它。通過第二種方法,當不需要時,您的'total'函數完全與'one'函數相關聯。 – wmock

1

傳入回調函數允許您動態地影響程序的流程。此外,您可以將total的結果作爲參數傳遞給callback,後者通常用於啓用異步編程。

function one(){ 
    alert("I'm one!") 
} 

function total(arg, callback){ 
    setTimeout(function() { 
    if (callback) { 
     callback(); 
    } 
    }, 1000); 
} 
0

回調參數允許您定義自定義交互。它通常與任何異步操作一起使用,以允許狀態變化的反應(例如,當操作完成或出錯時)。那

一個例子可以是(這裏用jQuery的simpliciy)AJAX調用:

var request = $.ajax({ 
    url: "script.php" 
}); 

// this allows you to specify custom action handling 
request.done(one);