2013-11-14 43 views
4

有沒有在javascript中調用具有未知數量參數的回調的方法?調用具有未知數量參數的回調

例如,如果這是我們調用的方法:

function invokeCallback(callback, params) { 
    return callback.invoke(params); 
} 

如果這些都是我們的例子中的回調方法:

function action() { 
    doSomeAction(); 
} 

function greet(msg) { 
    console.log(msg); 
} 

function nameage(name, age) { 
    var msg = 'My name is ' + name + ' and my age is ' + age; 
    console.log(msg); 
} 

而如果我們可以那麼輕鬆地調用它們像這樣:

invokeCallback(action); 
invokeCallback(greet, 'Hello!'); 
invokeCallback(nameage, 'Bob', 20); 

然後它會很好。

是這樣的可能嗎?然後

+0

糾正我,如果我錯了,但答案我的問題沒有包含在這個問題中。請修改您的評論。 –

+0

良好的通話。有時問題可能會與其他問題相匹配,但結果往往不同。在這種情況下,答案很簡單,爲了社區的緣故,我們應該爲那些只需要簡單答案的人提出這樣的問題。如果我需要更多信息,我一定會按照你的鏈接。再次感謝! –

回答

5

正如在其他的答案已經提到,Function.prototype.applyFunction.prototype.call是你想看的兩種方法。它們在操作方式上略有不同 - 應用程序將參數作爲單個數組,而調用將它們作爲單獨的參數。

您可能希望探索使用此技術的相關概念是currying

關於你的榜樣,你應該看看從你的函數定義中刪除params參數,並消除了開幕參數,它是回調函數本身:

function invokeCallback(callback) { 
    var params = Array.prototype.slice.call(arguments, 1); 
    return callback.apply(this, params); 
} 
3

是的,這是可能的。關鍵功能是Function#apply,它在提供上下文和參數時調用函數。參數以數組形式給出。 (通過這種方式,它不同於Function#call,其中的參數明確給出。)

因此,讓我們看看你的函數簽名:

function invokeCallback(callback, params) { 

我們可以做到這一點很簡單:

function invokeCallback(callback, params) { 
    return callback.apply(null, params); 
} 

(第一個參數是該函數的上下文,即其中的值爲this因爲我們不想指定任何特定的東西,所以我們使用null。)

但是,你打電話給你的運作方式略有不同:

invokeCallback(nameage, 'Bob', 20); 

你看到區別?這裏,參數是明確給出的,而不是數組。因此,我們需要稍微改變一下。在一個函數中,arguments對象包含提供給該函數的參數。在上述情況下,它將包含三個:nameage,'Bob'20。我們想用參數'Bob'20撥打nameage。對象看起來像一個數組,但它不是一個。因此,我們必須使用稍微複雜的呼叫到Array#slice函數來獲取值了:

var params = Array.prototype.slice.call(arguments, 1); // get all arguments after the first one 

因此,我們的功能是這樣的:

function invokeCallback(callback) { 
    var params = Array.prototype.slice.call(arguments, 1); // get all arguments after the first one 

    return callback.apply(null, params); 
} 
+0

完美地回答了這個問題,並且簡潔地表達了與顯而易見的重複問題上的答案不同的問題。謝謝@lonesomeday! –