我正在尝试编写一个使用其第一个参数的函数,然后将其余的(不知道多少个)发送给另一个:
function consume_data() {
args = consume_data.arguments;
do_some(args[0]);
consume_the_rest(args[1], args[2], args[3] ... );
}
Run Code Online (Sandbox Code Playgroud)
我是否必须使用字符串来组成呼叫和评估或是否有更简洁的方式?
小智 5
传统的JavaScript方式......不幸的是.
function consume_data() {
do_some(arguments[0]);
var args = Array.prototype.slice.call(arguments, 1);
consume_the_rest.apply(this, args);
}
Run Code Online (Sandbox Code Playgroud)
您应该使用arguments 局部变量范围中提供的变量.然后借用.slice()从Array.prototype第二个开始获取一个参数数组.
然后使用该.apply()方法将这些参数作为集合传递,该集合将被解构为consome_the_rest方法中的各个参数.
为什么?
您需要借用的原因Array.prototype.slice是arguments对象实际上不是一个Array,因此它没有原型Array方法.
给出的第一个参数.apply()设置你正在调用的函数的调用上下文(this值),如上所述,argsArray将被解析为你正在调用的函数的执行上下文中的各个参数.这使得传递未知数量的参数成为可能.
一个替代方案,有警告.
如果你不关心函数的调用上下文,你实际上可以这样做......
function consume_data() {
do_some(arguments[0]);
consume_the_rest.call.apply(consume_the_rest, arguments);
}
Run Code Online (Sandbox Code Playgroud)
这里的.call()方法就像.apply()你单独传递参数而不是集合一样.所以我们调用.call()using .apply(),它将设置consume_the_rest为调用上下文.call(),并将其arguments展开,将第一个参数设置为调用上下文arg .call(),其余的是要传递的普通参数.
就好像你做的那样......
consume_the_rest.call(arguments[0], arguments[1], ...arguments[n])
Run Code Online (Sandbox Code Playgroud)
...所以第一个参数实际上将用作调用上下文,其余的将是您期望的.
同样,只有在你不关心你正在调用的函数的调用上下文时才这样做.