将可变参数传递给函数 - JavaScript

3

我定义了一个函数,它可以接受任意数量的参数,但没有必需的参数:

function MyFunction() { //can take 0, 1, 1000, 10000, n arguments
//function code
}

现在我想编写另一个函数,每次使用可变数量的参数调用MyFunction:
function Caller(n) {
var simple_var = "abc";
MyFunction() //how can i pass simple_var to MyFunction n times?
} 

提前感谢您:)

1
除非它们是构造函数,否则您不应将函数命名为大写。 - Bergi
2个回答

8

Function.apply可以被用来将一个参数数组传递给函数,就像每个数组元素都被当做单独的参数一样:

function Caller(n) {
   var simple_var = "abc";

   // create an array with "n" copies of the var
   var args = [];
   for (var i = 0; i < n; ++i) {
      args.push(simple_var);
   }

   // use Function.apply to send that array to "MyFunction"
   MyFunction.apply(this, args);
}

值得一提的是,对于WebKit引擎,参数长度仅限于65536

2
  1. 使用 args[args.length] 替代 args.push()
  2. 您的解决方案将数组作为参数提交,而不是 n 个不同的参数。
- Amberlamps
2
@Amberlamps - apply 就是用来处理这种情况的。它会提交 n 个参数。 - Jibi Abraham
@Amberlamps,你错了——.call用于将其作为数组发送,.apply用于将其作为参数列表发送。 - Alnitak
1
@Amberlamps 还有,array.push()args[args.length] 之间的性能差异可以忽略不计 - 参见 http://jsperf.com/array-push-and-append-by-index - Alnitak
@Alnitak:哈哈,我之前找到了一项不同的统计数据,但现在找不到了。这再次证明了互联网并不是完全可信的 :) - Amberlamps
@Amberlamps,你不应该无谓地使用shiftunshift,因为它们需要重新编号剩余的元素,但是pushpop非常高效。 - Alnitak

-3

你可以使用 eval(我知道,eval 是邪恶的)。

在 for 循环中构造字符串:

var myCall = "Myfunction(abc, abc, abc)";

然后将其传递给 eval

function Caller(n) {
var simple_var = "abc";
  eval(myCall);
} 

1
永远、绝对不要使用 eval - Alnitak

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