Il y a des choses qui sont impossibles à faire dans JS sans fonction comme eval ( eval, Functionet peut - être plus).
Prenez applypar 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 evalou Function(j'utilise Functiondans 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.Newutilisent, mais non seulement c'est verbeux et maladroit, mais (par définition) il doit être fini. Functionpermet au code de fonctionner pour n'importe quel nombre d'arguments.
evalpensez-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.