2011-06-22 49 views
6

在我的项目中,我注册了不同的函数(具有不同数量的参数)作为多个事件的监听器。当事件发生时,我需要触发相关的功能。我以数组的形式接收要传递给侦听器方法的参数,而侦听器函数期望每个单独的参数。所以,我这样做是这样,但我不喜欢这种方法,并想知道是否有这样做的一个优雅的方式,Javascript未知数量的参数

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(); 
     } 
    } 
+0

谢谢大家。 fun.apply正是我所需要的。它简单而又甜蜜:)并且正好解决了我的问题。 – Nutty

回答

2

使用。适用

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,它将不起作用,因为它将始终保持不变,而与该函数定义的参数数量无关。

1

试试这个使用function.apply

function callListenerWithArgs(func, args){ 
    func.apply(window, args); 
} 
+0

.call不接受数组。 .apply确实 –

+0

@cwolves。再看看我的答案。 – Neal

+2

你编辑它,我的评论仍然适用 –

1

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); 
} 

,或者如果阵列已经建成,只是把它作为第二个参数。适用

+0

@Downvoter:解释。 – Robert

-1

你可以得到的函数的参数个数:

var f = function () { console.log(arguments.length); } 
f(2, 3) // > 2 

让您可以直接在地方实现你func功能。

function func() { 
    var nbArgs = arguments.length; 
    // ... 
}