Разрешить функцию 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 }

Возможно ли это? Также, если аргументы не определены, как я могу это обработать?

Например, если один вызов функции имеет несколько обратных вызовов, а другой - только один, есть способ обработки отсутствия наличия обратных вызовов.

Приветствия,

:)

Ответы

Ответ 1

Вы можете использовать ключевое слово 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, Здесь отредактированная версия плагина, чтобы продемонстрировать это.

Ответ 3

Используйте переменную arguments.

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

и др.

Ответ 4

Да, это возможно, вот пример:

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