Il y a des choses qui sont impossibles à faire dans JS sans fonction comme eval ( eval
, Function
et peut - être plus).
Prenez apply
par exemple. Il est facile à utiliser lors de son utilisation sur des appels de fonction ordinaires:
foo.apply(null, [a, b, c])
Mais comment feriez-vous cela pour les objets que vous créez via une nouvelle syntaxe?
new Foo.apply(null, [a, b, c])
ne fonctionne pas, pas plus que les formulaires similaires.
Mais vous pouvez contourner cette limitation via eval
ou Function
(j'utilise Function
dans cet exemple):
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);
};
}) ();
Exemple:
Foo.New.apply(null, [a, b, c])
;
Bien sûr, vous pouvez créer manuellement les fonctions qui Function.prototype.New
utilisent, mais non seulement c'est verbeux et maladroit, mais (par définition) il doit être fini. Function
permet au code de fonctionner pour n'importe quel nombre d'arguments.
eval
pensez-vous de l'utilisation de gros morceaux de code comme le font des applications comme JSPacker? JSPacker + gzip entraîne généralement des tailles de fichier plus petites que les deux solutions en soi, mais comme vous le faites remarquer à juste titre, il lance essentiellement un compilateur deux fois sur le même morceau de code, plus une surcharge pour effectuer des remplacements de chaîne.