Javascript未知数量的参数
Posted
技术标签:
【中文标题】Javascript未知数量的参数【英文标题】:Javascript unknown number of arguments 【发布时间】:2011-09-20 12:08:20 【问题描述】:在我的项目中,我将不同的函数(具有不同数量的参数)注册为多个事件的侦听器。当事件发生时,我需要触发相关的函数。我以数组的形式接收要传递给侦听器方法的参数,而侦听器函数需要每个单独的参数。所以,我正在这样做,但我不喜欢这种方法,想知道是否有一种优雅的方法,
function callListenerWithArgs(func, args)
switch(args.length)
case 1:
func(args[0]);
break;
case 2:
func(args[0], args[1]);
break;
case 3:
func(args[0], args[1], args[2]);
break;
case 4:
func(args[0], args[1], args[2], args[3]);
break;
default:
func();
【问题讨论】:
谢谢大家。 fun.apply 正是我需要的。它简单而甜蜜:) 并准确地解决了我的问题。 【参考方案1】:使用 .apply
func.apply(null, args)
如果你需要绑定到一个特定的范围,你可以传入另一个参数在函数内部用作this
:
func.apply(scope, args);
此外,javascript 的一个细微差别是您可以调用具有未定义值的函数。因此,对现有代码进行小幅调整将适用于 95% 的所有情况(不建议将其作为解决方案,只是指出这一点):
// will handle any number of args up to 7
function callListenerWithArgs(func, args)
func(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
如果您的func
定义为:
function foo(a, b, c)
您会收到 a
、b
、c
传入,以及更多被忽略的 undefined
值。正如我上面所说,这适用于 95% 的情况。如果您在被调用的函数中检查arguments.length
,则它不起作用,因为无论函数定义的参数数量如何,它总是相同的。
【讨论】:
【参考方案2】:使用function.apply
试试这个
function callListenerWithArgs(func, args)
func.apply(window, args);
【讨论】:
.call 不接受数组。 .apply 确实 @cwolves。再看看我的回答。 @cwolves 我编辑得很快(在你评论之前)哈哈。不知怎的,你在不正确的地方看到了它^_^【参考方案3】:functionName.apply(thisScope, arguments)
会更优雅。 arguments
参数必须是一个数组。
你可以像这样构建数组:
var args = [];
switch (arguments.length - 1)
case 0:
break;
case 1:
args.push(arguments[1]);
break;
case 2:
args.push(arguments[1], arguments[2]);
break;
case 3:
args.push(arguments[1], arguments[2], arguments[3]);
break;
default:
args = Array.prototype.slice.call(arguments, 1);
或者如果数组已经构建,只需将它作为第二个参数传递给 .apply
【讨论】:
【参考方案4】:func.apply(this, args);
见here。
【讨论】:
【参考方案5】:你可以得到一个函数的参数个数:
var f = function ( ) console.log(arguments.length);
f( 2, 3 ) // > 2
这让您可以直接在原地实现 func
函数。
function func()
var nbArgs = arguments.length;
// ...
【讨论】:
以上是关于Javascript未知数量的参数的主要内容,如果未能解决你的问题,请参考以下文章