Hay algunas cosas que son imposibles de hacer en JS sin una función eval-como ( eval, Functiony tal vez más).
Toma applypor ejemplo. Es fácil de usar cuando se usa en llamadas a funciones normales:
foo.apply(null, [a, b, c])
Pero, ¿cómo haría esto para los objetos que está creando a través de una nueva sintaxis?
new Foo.apply(null, [a, b, c]) no funciona, ni lo hacen formas similares.
Pero puede evitar esta limitación a través de evalo Function(yo uso Functionen este ejemplo):
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);
};
}) ();
Ejemplo:
Foo.New.apply(null, [a, b, c]);
Por supuesto, puede construir manualmente las funciones que Function.prototype.Newusa, pero no solo es detallado y torpe, sino que (por definición) tiene que ser finito. Functionpermite que el código funcione para cualquier número de argumentos.
evalopina sobre la introducción de grandes fragmentos de código de la forma en que les gusta a aplicaciones como JSPacker? JSPacker + gzip generalmente da como resultado tamaños de archivo más pequeños que cualquiera de las soluciones por sí solo, pero como señala correctamente, esencialmente está activando un compilador dos veces en la misma pieza de código, más algo de sobrecarga para hacer reemplazos de cadenas.