2013-07-07 88 views
11

如何將函數中的參數轉發給另一個函數?如何將一個函數的所有但是第一個參數的參數轉發到另一個函數?

我有這樣的:

function SomeThing(options) { 
    function callback(callback_name) { 
    if(options[callback_name]) { 
     // Desiring to call the callback with all arguments that this function 
     // received, except for the first argument. 
     options[callback_name].apply(this, arguments); 
    } 
    } 
    callback('cb_one', 99, 100); 
} 

我得到的a說法是「cb_one」,但我想它應該是「99」。

var a = new SomeThing({ 
    cb_one: function(a,b,c) { 
    console.log(arguments); // => ["cb_one", 99, 100] 
    console.log(a);   // => cb_one 
    console.log(b);   // => 99 
    console.log(c);   // => 100 
    } 
}); 

我該怎麼做?

回答

22

使用options[callback_name].apply(this, [].slice.call(arguments,1));

[].slice.call(arguments,1)變量( 'array-like')Object轉換爲包含所有參數但將第一個真正的Array

[].slice.call也可以寫成Array.prototype.slice.call

+5

這可能是更清晰使用'Array.prototype.slice.call'而不是'[] .slice.call' - 這表明沒有什麼特別的空數組。 –

1

你可以做什麼Kooilnc做。但我個人不喜歡寫[].slice.callArrray.prototype.slice.call。相反,我這樣做:

var bind = Function.bind; 
var call = Function.call; 

var bindable = bind.bind(bind); 
var callable = bindable(call); 

// this is the same as Array.prototype.slice.call 
var arrayFrom = callable(Array.prototype.slice); 

現在,你可以簡單的做:

options[callback_name].apply(this, arrayFrom(arguments, 1)); 

更多有關bindablecallable談話在JavaScript聊天室中的人:http://chat.stackoverflow.com/rooms/17/javascript

+0

爲什麼'可綁定'?只需做'var slice = Function.call.bind(Array.prototype.slice);' – 1983

+0

因爲在5行代碼中你會得到3個有用的函數 - 'bindable','callable'和'arrayFrom',可以用在很多不同的情況。例如,我可以在'apply'上使用'bindable'來創建一個'appliable'函數,該函數使用'func'函數並返回另一個相當於'func.apply'的函數。另外它看起來更乾淨。 –

+0

@NagaJolokia糟糕。我忘了在最後的評論中提到你。 –

相關問題