我正在尝试编写一个函数 将使用其第一个参数,然后将其余的(不知道有多少)发送给另一个:
function consume_data() {
args = consume_data.arguments;
do_some(args[0]);
consume_the_rest(args[1], args[2], args[3] ... );
}
我是否必须使用字符串来组成呼叫和评估或是否有更简洁的方式?
答案 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);
}