Цель состоит в том, чтобы создать оболочку, обеспечивающую согласованный метод вызова собственных функций с переменной арностью на различных хостах сценариев, чтобы сценарий мог выполняться в браузере, а также в Windows Script Host или других механизмах сценариев.
Мне известны 3 метода, каждый из которых имеет свои недостатки.
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 принципа.
Сценарий может выполняться на старых (до JavaScript 1.3 / ECMA-262-3) движках, которые не поддерживают метод apply()
.
Теперь часть вопроса: есть ли другое решение?