Es gibt einige Dinge , die in JS zu tun , ohne eine eval-ähnlichen Funktion (unmöglich sind eval
, Function
und vielleicht auch mehr).
Nimm apply
zum Beispiel. Es ist einfach zu bedienen, wenn es für gewöhnliche Funktionsaufrufe verwendet wird:
foo.apply(null, [a, b, c])
Aber wie würden Sie dies für Objekte tun, die Sie mithilfe einer neuen Syntax erstellen?
new Foo.apply(null, [a, b, c])
funktioniert nicht und macht auch keine ähnlichen Formen.
Sie können diese Einschränkung jedoch mit eval
oder umgehen Function
(ich verwende Function
in diesem Beispiel):
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);
};
}) ();
Beispiel:
Foo.New.apply(null, [a, b, c])
;
Natürlich können Sie die Funktionen, die Function.prototype.New
verwendet werden, manuell erstellen , aber dies ist nicht nur ausführlich und klobig, es muss (per Definition) endlich sein. Function
ermöglicht es dem Code, für eine beliebige Anzahl von Argumenten zu arbeiten.
eval
große Codestücke so zu erstellen, wie es Anwendungen wie JSPacker tun? JSPacker + gzip führt normalerweise zu kleineren Dateigrößen als jede der beiden Lösungen für sich. Wie Sie jedoch zu Recht betonen, wird ein Compiler im Wesentlichen zweimal mit demselben Code gestartet.