2010-08-27 177 views
15

我希望下面的函数更灵活,并且接受多个回调函数,如果它们在参数中定义的话。允许JavaScript函数接受任意数量的参数

$(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 } 

这可能吗?此外,如果参数未定义,我该如何处理?

例如,如果对该函数的一个调用定义了多个回调函数,而另一个回调函数只有一个回调函数,那么是否存在一种处理回调函数不存在的方法。

干杯,

:)

回答

27

您可以使用关键字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

+0

谢谢尼克我会看看我认为这种方法。 由于省略了'var'并且需要命名空间,我认为'settings'变成了全局的? – RyanP13 2010-08-27 10:04:13

+1

@ RyanP13 - 不是全局的,因为它是一个参数名称,它是本地的函数,你已经覆盖在那里:) – 2010-08-27 10:10:21

+1

+1对于传递一个对象,也要记住,无论你遇到什么情况你都不能记住参数(比如你的函数需要5个整数)重构它来获取一个对象。 – 2010-08-27 10:17:17

7

使用参数变量。

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

3

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

function myfunct() 
{ 

    var arguments = myfunct.arguments; 

    for (var i = 0; i < arguments.length; i++) 
     { 

       alert("Argument " + i + " value = " + arguments[i]); 

      } 

} 

您可以通过任意数量的参数调用这个fonction:

myfunct("foo"); 

myfunct("foo","bar");