Как создать переменную (со списком аргументов переменной длины) в JavaScript - PullRequest
1 голос
/ 18 марта 2010

Цель состоит в том, чтобы создать оболочку, обеспечивающую согласованный метод вызова собственных функций с переменной арностью на различных хостах сценариев, чтобы сценарий мог выполняться в браузере, а также в Windows Script Host или других механизмах сценариев.
Мне известны 3 метода, каждый из которых имеет свои недостатки.

  1. eval() метод:

    function wrapper () {
        var str = '';
        for (var i=0; i<arguments.lenght; i++)
            str += (str ?', ':'') + ',arguments['+i+']';
        return eval('[native_function] ('+str+')');
        }
    
  2. switch() метод:

    function wrapper () {
        switch (arguments.lenght) {
            case 0:
                return [native_function] (arguments[0]);
                break;
            case 1:
                return [native_function] (arguments[0], arguments[1]);
                break;
            ...
            case n:
                return [native_function] (arguments[0], arguments[1], ... arguments[n]);
            }
        }
    
  3. apply() метод:

    function wrapper () {
        return [native_function].apply([native_function_namespace], arguments);
        }
    

Что с ними не так, спросите вы?

  1. Хорошо, мы должны вникнуть во все причины, по которым eval() является злом? А также все конкатенации строк ... Не решение, которое будет помечено как "элегантный".

  2. Никогда нельзя знать максимум n и, следовательно, сколько cases нужно приготовить. Это также увеличило бы сценарий до огромных размеров и согрешило против священного DRY принципа.

  3. Сценарий может выполняться на старых (до JavaScript 1.3 / ECMA-262-3) движках, которые не поддерживают метод apply().

Теперь часть вопроса: есть ли другое решение?

Ответы [ 2 ]

3 голосов
/ 18 марта 2010

Просто используйте apply(). И для ваших устаревших механизмов исполнения, просто сделайте это

if ( 'undefined' == typeof Function.prototype.apply )
{
  Function.prototype.apply = function( context, args )
  {
    // whatever hacky way you want to implement it - i guess eval.
  }
}
0 голосов
/ 20 апреля 2012

Так же, как автоматическая переменная this, существует переменная arguments, которая содержит все аргументы, переданные функции. См. javascript variadic .

...