Javascript未知数量的参数

Nut*_*tty 6 javascript variables arguments

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

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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

小智 2

使用.apply

func.apply(null, args)
Run Code Online (Sandbox Code Playgroud)

如果需要绑定到特定范围,可以传递另一个参数以在this函数内部使用:

func.apply(scope, args);
Run Code Online (Sandbox Code Playgroud)

此外,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]);
}
Run Code Online (Sandbox Code Playgroud)

如果你的func定义为:

function foo(a, b, c){
}
Run Code Online (Sandbox Code Playgroud)

您会传入a, b,以及其他一些被忽略的值。正如我上面所说,这在 95% 的情况下都有效。如果您签入被调用的函数,它就不起作用,因为无论函数定义的参数数量如何,它总是相同的。cundefinedarguments.length