传递参数数组

Passing an array of arguments

本文关键字:数组 参数      更新时间:2023-09-26

>我正在尝试让一个函数传递一个函数并使用一组参数调用它。 例如:

function foo(func, args) {
  return func(args);
}

但是,我不知道 args 中可能有多少元素,func 应该能够是一个接受任意数量参数的任意函数。 我该如何处理?

还说我想存储传递给 foo 的函数,并且只有在以前没有调用过时才调用它们。

我可以做这样的事情吗:

var calledFuncs = [];
function foo(func, args) {
  if(calledFuncs.indexOf(func) === -1) {
    calledFuncs.push(func);
    return func(args);
  }
}

谢谢,我对 JavaScript 中的函数式编程有点陌生。

您正在寻找func.apply

  • 第一个参数是上下文,又名this值。你不想改变这一点,所以通过它。
  • 第二个参数是一个包含参数的数组,当然可以是动态长度。

所以你可以这样做:

return func.apply(this, args);

您似乎对第二个问题(替换func(args))有很好的方法。不过,您可能希望存储被调用函数的返回值,因为foo现在为除第一个调用之外的任何调用返回undefined

使用 apply

func.apply(this, args);

apply将参数数组作为第二个参数。

apply的第一个参数将是要调用的函数范围内的 this 值。因此,您可以传入当前this或您想要的任何其他内容。

就您的第二个问题而言,这仅适用于命名函数。您可以使用 func.name 将函数名称存储在数组中:

var calledFuncs = [];
function foo(func, args) {
   if(calledFuncs.indexOf(func.name) === -1) {
      calledFuncs.push(func.name);
      return func(args);
   }
}

这不适用于匿名函数,也不适用于 IE 或 Opera 中的命名函数。你将不得不解析它,也许是这样的:

var name = func.toString().replace(/'n/g, "").replace(/'s*'(.*$/, "").replace(/^'s*function's+/, "");

至于你的第二个问题,你可以做你现在正在做的事情。但我认为它不适用于以下情况:

foo(function() {
}, []);
foo(function() {
}, []);

它将调用这两个函数。

你想要Function.prototype.apply

func.apply(this,args);

将上下文(第一个参数)设置为所需的任何内容,包括null以获取全局window(就像当前func(...)调用一样)。

虽然与您的问题没有直接关系,但另请参阅相关的 Function.prototype.call 方法,该方法允许您类似地设置上下文,但传递显式参数。