Разрешение функции JavaScript принимать любое количество аргументов - PullRequest
21 голосов
/ 27 августа 2010

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

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

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

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

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

:)

Ответы [ 6 ]

31 голосов
/ 27 августа 2010

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

8 голосов
/ 27 августа 2010

Использовать аргументы переменную.

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

и т.д.

7 голосов
/ 27 августа 2010
3 голосов
/ 29 марта 2018

Благодаря оператору распространения теперь вы можете делать что-то вроде этого

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]);
3 голосов
/ 27 августа 2010

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

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");
0 голосов
/ 01 августа 2017

В более поздние времена вы можете теперь использовать или операторы распространения и отдыха, как подробно описано здесь - Передать неизвестное количество аргументов в функцию javascript

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...