Es gibt einige Dinge , die in JS zu tun , ohne eine eval-ähnlichen Funktion (unmöglich sind eval, Functionund vielleicht auch mehr).
Nimm applyzum 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 evaloder umgehen Function(ich verwende Functionin 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.Newverwendet werden, manuell erstellen , aber dies ist nicht nur ausführlich und klobig, es muss (per Definition) endlich sein. Functionermöglicht es dem Code, für eine beliebige Anzahl von Argumenten zu arbeiten.
evalgroß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.