dijo Como en varias ocasiones, se considera mala práctica utilizar el Function constructor (véase también la ECMAScript Language Specification, 5 ª edición , § 15.3.2.1):usos legítimos del constructor Función
new Function ([arg1[, arg2[, … argN]],] functionBody)
(donde todos los argumentos son cadenas que contienen nombres de argumento y la última (o única) cadena contiene el cuerpo de la función).
A modo de recapitulación, se dice que es lento, según lo explicado por the Opera team:
Cada vez que [...] el
Function
se llama al constructor en una cadena que representa el código fuente, el motor de guiones debe comenzar la maquinaria que convierte el código fuente en el código ejecutable . Esto suele ser costoso para el rendimiento - fácilmente cien veces más caro que una simple función llamada, por ejemplo. (Marcos Tarquino 'Wilton-Jones)
Aunque no es que mal, de acuerdo con this post en MDC (no he probado esto por mí mismo usando la versión actual de Firefox, sin embargo).
Crockford adds que
[e] l citando convenciones del lenguaje hacen que sea muy difícil de expresar correctamente cuerpo de una función como una cadena . En el formulario de cadena, no se puede realizar la comprobación de errores temprana . [...] Y desperdicia memoria porque cada función requiere su propia implementación independiente .
Otra diferencia es que
una función definida por una función constructor no hereda ningún margen que no sea el ámbito global (que todas las funciones heredan). (MDC)
Aparte de esto, usted tiene que estar atento para evitar la inyección de código malicioso, cuando se crea un new Function
utilizando contenidos dinámicos.
Dicho esto, T.J. dice Crowder en an answer que
[n] o casi nunca es cualquier necesidad de la similares [...] nueva función (...), ya sea , de nuevo a excepción de algunos casos extremos avanzadas.
Entonces, ahora me pregunto: ¿cuáles son estos "casos avanzados"? ¿Existen usos legítimos del constructor de funciones?
ES5 en modo estricto no arroja cuando se utiliza 'nueva función' ... –
@ Šime: Según la especificación (Anexo C), debería:" Intentar definir dinámicamente una función de modo tan estricta utilizando la función constructor (15.3.2) lanzará una excepción 'SyntaxError', pero una prueba reveló que no. ¿Estoy malentendiendo algo? –
Bien, lea la oración anterior. "Una función de modo tan estricto" se refiere a una función que o bien el nombre o uno de los parámetros es "eval" o "argumentos". –