【问题标题】:Javascript unknown number of argumentsJavascript未知数量的参数
【发布时间】: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 正是我需要的。它简单而甜蜜:) 并准确地解决了我的问题。

标签: javascript variables arguments


【解决方案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){
}

您会收到 abc 传入,以及更多被忽略的 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;
          // ...
        }
        

        【讨论】:

          猜你喜欢
          • 2022-08-09
          • 2011-05-06
          • 2015-08-02
          • 2016-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-14
          • 2019-07-04
          相关资源
          最近更新 更多