使用被调用者参数列表的尾部调用函数

时间:2012-03-26 23:09:12

标签: javascript

我正在尝试编写一个函数 将使用其第一个参数,然后将其余的(不知道有多少)发送给另一个:

function consume_data() {
   args = consume_data.arguments;
   do_some(args[0]);
   consume_the_rest(args[1], args[2], args[3] ... );
}

我是否必须使用字符串来组成呼叫和评估或是否有更简洁的方式?

2 个答案:

答案 0 :(得分:5)

传统的JavaScript方式......不幸的是。

function consume_data() {

    do_some(arguments[0]);

    var args = Array.prototype.slice.call(arguments, 1);

    consume_the_rest.apply(this, args);
}

您应该使用局部变量范围中提供的arguments变量。然后从.slice()借用Array.prototype以获取从第二个开始的参数数组。

然后使用.apply()方法将这些参数作为集合传递,该集合将在consome_the_rest方法中被解构为单个参数。


为什么吗

您需要借用Array.prototype.slice的原因是arguments对象实际上不是数组,因此它没有原型数组方法。

.apply()的第一个参数设置你正在调用的函数的调用上下文this value),正如我上面提到的,{{1在您调用的函数的执行上下文中,数组将被解构为单个参数。这使得传递未知数量的参数成为可能。


另一种选择,有警告。

如果你不关心函数的调用上下文,你实际上可以这样做......

args

此处function consume_data() { do_some(arguments[0]); consume_the_rest.call.apply(consume_the_rest, arguments); } 方法与.call()类似,只是您单独传递参数而不是集合。因此,我们使用.apply()调用.call().apply()consume_the_rest设置为.call()的调用上下文,并将arguments展开,设置第一个参数作为.call()的调用上下文arg,其余的是要传递的普通参数。

就好像你做了......

consume_the_rest.call(arguments[0], arguments[1], ...arguments[n])

...所以第一个参数实际上将用作调用上下文,其余的将是您期望的那个。

同样,只有在你不关心你正在调用的函数的调用上下文时才这样做。

答案 1 :(得分:1)

请参阅Function.apply

function consume_data() {
   do_some(arguments.shift());
   consume_the_rest.apply(this, args);
}