Есть некоторые вещи, которые невозможно сделать в JS без Eval подобных функций ( eval
, Function
, и , возможно , больше).
Взять apply
к примеру. Его легко использовать при использовании обычных вызовов функций:
foo.apply(null, [a, b, c])
Но как бы вы сделали это для объектов, которые вы создаете с помощью нового синтаксиса?
new Foo.apply(null, [a, b, c])
не работает, и не делают аналогичные формы.
Но вы можете обойти это ограничение с помощью eval
или Function
(я использую Function
в этом примере):
Function.prototype.New = (function () {
var fs = [];
return function () {
var f = fs[arguments.length];
if (f) {
return f.apply(this, arguments);
}
var argStrs = [];
for (var i = 0; i < arguments.length; ++i) {
argStrs.push("a[" + i + "]");
}
f = new Function("var a=arguments;return new this(" + argStrs.join() + ");");
if (arguments.length < 100) {
fs[arguments.length] = f;
}
return f.apply(this, arguments);
};
}) ();
Пример:
Foo.New.apply(null, [a, b, c])
;
Конечно, вы можете вручную создавать функции, которые Function.prototype.New
используют, но это не только многословно и неуклюже, но и (по определению) должно быть конечным. Function
позволяет коду работать с любым количеством аргументов.
eval
создании больших кусков кода так, как это нравится приложениям вроде JSPacker? JSPacker + gzip обычно приводит к меньшим размерам файлов, чем любое другое решение само по себе, но, как вы правильно заметили, это по сути запускает компилятор дважды для одного и того же куска кода, а также накладные расходы для замены строк.