传递参数数组
Passing an array of arguments
>我正在尝试让一个函数传递一个函数并使用一组参数调用它。 例如:
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
方法,该方法允许您类似地设置上下文,但传递显式参数。
相关文章:
- jQuery数组参数和each()
- 将数组参数传递给XMLHttpRequest对象
- 使用数组参数构建URL
- 如何将JavaScript数组编码为与PHP兼容的“;数组参数“;在查询字符串中
- Ajax 无法使用带有 2D 数组参数的 C# 控制器操作
- 如何使用按数组参数过滤的角度访问嵌套的 JSON 数组数据
- 如何将变量名称用于数组参数
- 如何将“回调”数组参数传递给匿名函数
- JavaScript 无法从函数的数组参数中获取值
- 在Javascript函数中使用新的ES2015 rest参数而不是使用数组参数有什么优点
- Mongo:使用$in数组参数对结果进行排序
- 如何将数组参数从Code-behind传递给javascript
- 数组参数Vs直接参数传递给Javascript函数
- 数组参数解构抛出意外错误
- 如何创建一个基于数组参数的函数
- 如何在javascript中获取URL数组参数
- 如何将数组参数从url转换为javascript中的对象
- 如何从集合中通过数组参数获取模型
- 流星.调用检查数组参数
- Javascript数组参数问题