JavaScript:转发接受可变数量参数的函数调用

11
我认为我需要类似于Ruby的splat * 在这里使用。
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]"。这也许是有道理的。它传递了代表参数的对象,但没有单独传递参数。

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

2个回答

22

更新:自从ES6以后,你可以使用扩展语法来调用函数,将可迭代对象的元素作为函数调用的参数值应用于函数中:

function bar() {
  return foo(...arguments);
}
请提供需要翻译的内容。
function sum(...args) { //  args is an array
  return args.reduce((total, num) => total + num)
}

function bar(...args) {
  return sum(...args) // this just forwards the call spreading the argument values
}

console.log(bar(1, 2, 3)); // 6

在ES3/ES5时代,要正确地将参数传递给另一个函数,你需要使用 apply 方法:

function bar() {
  return foo.apply(null, arguments);
}
apply 方法接受两个参数,第一个是 thisObj,它的值将用作在调用函数时传递的this值,如果使用 null 或者 undefined,则函数内部的this值将引用全局对象,在非严格模式下,则为undefinedapply 期望的第二个参数是一个类似数组的对象,其中包含要应用于函数的参数值。
请参阅上面的示例此处

3

尝试使用return foo.apply(this,arguments)。你也可以直接在foo函数中使用Array.prototype.slice.apply(arguments).join('')


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接