2010-06-25 85 views
9

我认为我需要类似ruby的splat *这里。Javascript:转发函数调用的参数数量可变

function foo() { 
    var result = ''; 
    for (var i = 0; i < arguments.length; i++) { 
    result += arguments[i]; 
    } 
    return result; 
} 

function bar() { 
    return foo(arguments) // this line doesn't work as I expect 
} 

bar(1, 2, 3); 

我想这回"123",而是我得到"[object Arguments]"。我想,这是有道理的。它传递的是表示参数的对象,而不是单独的参数。

那么,我该如何简单地将任意数量的参数转发给另一个接受任意数量参数的函数呢?

回答

19

为了正确地传递参数到另一功能,则需要使用apply

function bar() { 
    return foo.apply(null, arguments); 
} 

apply方法采用两个参数,第一是thisObj,它的值将被用作this值在调用的函数内部,如果使用nullundefined,函数内部的this值将引用全局对象。

apply期望的第二个参数是一个类似数组的对象,它包含要应用于该函数的参数。

检查上述示例here

3

试试这个return foo.apply(this,arguments)。你也可以使用Array.prototype.slice.apply(arguments).join('')作为你的foo功能。