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

call a function with the tail of the callee's arguments list

本文关键字:参数 列表 函数 被调用者 尾部 调用      更新时间:2023-09-26

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

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

我必须使用字符串来编写调用和eval吗?或者有更整洁的方法吗?

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

function consume_data() {
    do_some(arguments[0]);
    var args = Array.prototype.slice.call(arguments, 1);
    consume_the_rest.apply(this, args);
}

您应该使用本地变量作用域中提供的arguments变量。然后从Array.prototype中借用.slice(),得到一个以第二个参数开头的数组。

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


为什么

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

.apply()的第一个参数设置您正在调用的函数的调用上下文this值),如上所述,args数组将在您正在调用函数的执行上下文中被分解为单独的参数。这使得传递数量未知的参数成为可能。


另一种选择,需要注意

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

function consume_data() {
    do_some(arguments[0]);
    consume_the_rest.call.apply(consume_the_rest, arguments);
}

这里的.call()方法与.apply()类似,只是您单独传递参数而不是作为一个集合传递参数。因此,我们使用.apply()调用.call(),它将consume_the_rest设置为.call()的调用上下文,并展开arguments,将第一个参数设置为.call()的调用上下文arg,其余的是要传递的正常参数。

就好像你做了。。。

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

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

同样,只有当您不关心正在调用的函数的调用上下文时,才能执行此操作。

请参阅功能应用:

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