【问题标题】:Allowing javascript function to accept any number of arguments允许 javascript 函数接受任意数量的参数
【发布时间】:2011-04-04 17:25:32
【问题描述】:

如果在参数中定义了其他函数,我希望下面的函数更灵活并接受对其他函数的多个回调。

$(function() {
    function icisDashBox(colorElem, thisWidth, thisHeight, completeCallBack) {
        $(colorElem).colorbox({
        transition: 'none',
        innerWidth: thisWidth,
        innerHeight: thisHeight,
        opacity: '0.5',
        onOpen: function() { 

        },
        onLoad: function() { 

        },
        onComplete:function() { 
            $('#cboxLoadedContent').wrap('<div id="icis_dialog_msg" />'); 

            completeCallBack();

        },
        onCleanup: function() { 

        },      
        onClosed: function() {
            $('#cboxLoadedContent').unwrap(); 
        }
    });
}

icisDashBox('.example9', '500', '500', completeFunction);

function completeFunction() {

    var fooClass = $("#colorbox").addClass("FOO");

    var barClass = $("#colorbox").addClass("BAR");

    var ajaxCnt = $.ajax({
        type: "GET",
        url: "http://www.payso.me.uk",
        dataType: "html",
        success: function(data) {
            $("#colorbox").addClass("AJAX SUCCESS");
        }
    });

    return {
        x : fooClass,
        y : barClass,
        z : ajaxCnt                         
    };
}

所以在理想情况下,我的函数在没有明确声明任何参数的情况下看起来像这样:

function icisDashBox() { function code here }

这可能吗?另外,如果没有定义参数,我该如何处理?

例如,如果对函数的一次调用定义了多个回调,而另一个调用只有一个,那么有一种方法可以处理缺少回调的情况。

干杯,

:)

【问题讨论】:

    标签: javascript jquery function


    【解决方案1】:

    感谢扩展运算符,您现在可以做这样的事情

    function myFunction(...params) {
      console.log(...params);
    }
    
    myFunction('Many arguments', 1, {two: 3}, ["four", 5]);
    
    // to access one by one
    function oneByOne(...params) {
      params.map(param => {
       console.log(param);   
      });
    }
    
    oneByOne('Many arguments', 1, {two: 3}, ["four", 5]);

    【讨论】:

      【解决方案2】:

      最近,您现在可以使用此处详述的扩展和休息运算符 - Pass unknown number of arguments into javascript function

      【讨论】:

        【解决方案3】:

        您可以使用关键字arguments,它是传递参数的数组,如下所示:

        function myFunc() {
           if(arguments.length > 0)     //be sure to check if there are any...
             var arg1 = arguments[0];
        }
        

        然而,更好的方法是接受一个对象,例如:

        function myFunc(settings) {
           settings = settings || {};   //in case it was called as just: myfunc()
           var something = settings.something || "default value";
        }
        

        你可以这样称呼它:

        myFunc({ something: "value", somethingElse: "otherValue" });
        

        这种方法也允许你接受任意数量的参数,但也有任何可选的,没有一堆myFunc(null, null, null, "value") 类型调用来只提供你想要的参数,而且它们被命名为 更易于维护的 IMO。 Here's an edited version of the plugin to demonstrate this.

        【讨论】:

        • @RyanP13 - 不,不是全局的,因为它是函数本地的参数名称,你已经被覆盖了:)
        • +1 对于传递一个对象,还请记住,每当您遇到不记得参数的情况时(例如,您的函数需要 5 个整数)重构它以获取一个对象。
        • @RyanP13 - 试试这样的东西,更紧凑,更容易维护:) jsfiddle.net/nick_craver/7NZ7M/1
        • @RyanP13 - 是的,您需要匿名函数,否则它会立即运行代码,因此您需要 onLoadCall: function() { $('body').prepend('&lt;span class="prepend"/&gt;'); } 作为选项。如果它是一个命名函数,你只需使用option: functioName,没有括号。
        • @RyanP13 - 它检查传递的是一个函数,所以如果你做了onCompleteCall: "bob",它不会在尝试做"bob".call(this)时崩溃,因为string没有.call() 功能...只是安全检查:)
        【解决方案4】:

        使用参数变量。

        function TestMe()
        {
           var args = arguments;
        
           for (var a in args)
           {
             alert(args[a]);
           }
        }
        

        现在您可以将任意数量的参数传递给TestMe 函数:

        TestMe(1);
        TestMe(1,2,3);
        TestMe(1,2,3,4,5,6);
        TestMe.apply(this, [1,2,3,4,5]); 
        

        等等

        【讨论】:

          【解决方案5】:

          是的,这是可能的,这是一个例子:

          function myfunct()
          {
          
            var arguments = myfunct.arguments;
          
            for (var i = 0; i < arguments.length; i++)
                  {
          
                          alert("Argument " + i + " value = " + arguments[i]);
          
                      }
          
          }
          

          您可以通过任意数量的参数调用此函数:

          myfunct("foo");
          
          myfunct("foo","bar");
          

          【讨论】:

            【解决方案6】:
            猜你喜欢
            • 2015-08-14
            • 1970-01-01
            • 1970-01-01
            • 2013-01-13
            • 1970-01-01
            • 1970-01-01
            • 2018-11-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多