1

Цель состоит в том, чтобы создать оболочку, чтобы обеспечить последовательный метод вызова собственных функций с переменной arity на разных хостах сценариев - чтобы сценарий мог быть выполнен в браузере, а также в Windows Script Host или других сценариях.
Я знаю 3 метода, каждый из которых имеет свои недостатки.Как создать переменную (с аргументом аргумента переменной длины) в JavaScript

  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. Сценарий может быть выполнен на старых (pre-JavaScript 1.3/ECMA-262-3) двигателях, которые не поддерживают метод apply().

Теперь часть вопроса: есть ли еще какое-то решение?

+2

Какой механизм Javascript используется сегодня, не поддерживает '.apply()'? – SLaks

+0

Какие родные функции вы имеете в виду? Я не могу думать ни о каких переменных, которые могут иметь разные аргументы в зависимости от среды. – meouw

+2

Никакая платформа с такой устаревшей реализацией Javascript не будет интересна для вас. Скорее всего, на таких платформах этот вопрос будет наименее опасным. – Pointy

ответ

3

Просто используйте 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

Итак, нет четвертого метода? Хорошо, тогда я пойду с этим. Благодаря! –

-1

Так же, как автоматический «этой» переменным, есть переменное «аргументы», которая содержит все аргументы, передаваемые в функцию. См. javascript variadic.

+1

Речь идет о создании переменной ** функции ** wrapper **, которая передает все свои аргументы другой функции. * Подсказка: сначала попробуйте прочитать весь вопрос.* Кроме того, вы не можете перезаписывать объект 'arguments' другой функции извне. –

Смежные вопросы