Ci sono alcune cose che sono impossibili da fare in JS senza una funzione eval-simile ( eval
, Function
, e forse più).
Prendi apply
ad esempio. È facile da usare quando lo si utilizza su normali chiamate di funzione:
foo.apply(null, [a, b, c])
Ma come faresti per gli oggetti che stai creando tramite una nuova sintassi?
new Foo.apply(null, [a, b, c])
non funziona, né forme simili.
Ma puoi aggirare questa limitazione tramite eval
o Function
(io uso Function
in questo esempio):
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);
};
}) ();
Esempio:
Foo.New.apply(null, [a, b, c])
;
Certo, potresti costruire manualmente le funzioni che Function.prototype.New
usa, ma non solo questo è dettagliato e goffo, (per definizione) deve essere finito. Function
consente al codice di funzionare per qualsiasi numero di argomenti.
eval
pensi di grandi blocchi di codice come piace ad applicazioni come JSPacker? JSPacker + gzip di solito produce file di dimensioni inferiori rispetto a ciascuna soluzione da sola, ma come giustamente fai notare, sta essenzialmente accendendo un compilatore due volte sullo stesso pezzo di codice, oltre ad un sovraccarico per sostituire le stringhe.