2013-07-07 90 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糟糕。我忘了在最后的评论中提到你。 –

相关问题