Цель состоит в том, чтобы создать оболочку, чтобы обеспечить последовательный метод вызова собственных функций с переменной arity на разных хостах сценариев - чтобы сценарий мог быть выполнен в браузере, а также в Windows Script Host или других сценариях.
Я знаю 3 метода, каждый из которых имеет свои недостатки.Как создать переменную (с аргументом аргумента переменной длины) в JavaScript
eval()
метод:function wrapper() { var str = ''; for (var i=0; i<arguments.lenght; i++) str += (str ?', ':'') + ',arguments['+i+']'; return eval('[native_function] ('+str+')'); }
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]); } }
apply()
метод:function wrapper() { return [native_function].apply([native_function_namespace], arguments); }
Что с ними не так?
Ну, мы вникаем во все причины, по которым
eval()
является злом? А также все конкатенации строк ... Не решение, которое будет называться «элегантным».Невозможно узнать максимум
n
и, следовательно, сколькоcases
подготовить. Это также расширит сценарий до огромных размеров и согрешит против святого DRY принцип.Сценарий может быть выполнен на старых (pre-JavaScript 1.3/ECMA-262-3) двигателях, которые не поддерживают метод
apply()
.
Теперь часть вопроса: есть ли еще какое-то решение?
Какой механизм Javascript используется сегодня, не поддерживает '.apply()'? – SLaks
Какие родные функции вы имеете в виду? Я не могу думать ни о каких переменных, которые могут иметь разные аргументы в зависимости от среды. – meouw
Никакая платформа с такой устаревшей реализацией Javascript не будет интересна для вас. Скорее всего, на таких платформах этот вопрос будет наименее опасным. – Pointy