La Sintaxis «new Function»
En JavaScript, existe una forma adicional de crear funciones que se utiliza en situaciones muy específicas: la sintaxis new Function
.
Sintaxis
Para crear una función con esta sintaxis, se utiliza:
let func = new Function([arg1, arg2, ...argN], functionBody);
Esta sintaxis permite definir una función con los argumentos arg1
, arg2
, …, argN
y el cuerpo functionBody
.
Ejemplos
Por ejemplo, aquí hay una función con dos parámetros:
let sumar = new Function('a', 'b', 'return a + b');
alert(sumar(1, 2)); // 3
Y aquí hay una función sin parámetros, solo con el cuerpo de la función:
let diHola = new Function('alert("Hola")');
diHola(); // Hola
Características
La diferencia principal con respecto a otras maneras de crear funciones es que new Function
permite crear una función a partir de una cadena de texto que se evalúa en tiempo de ejecución. Esto es útil en casos donde el código de la función no se conoce de antemano y puede cambiar dinámicamente.
Por ejemplo, podemos recibir código desde un servidor y convertirlo en una función:
let str = ... obtener código dinámicamente desde un servidor ...
let func = new Function(str);
func();
Este método es útil en situaciones avanzadas de desarrollo, como al compilar dinámicamente funciones a partir de plantillas o recibir código ejecutable de un servidor.
Clausuras
Normalmente, una función recuerda su entorno léxico a través de una propiedad especial llamada [[Environment]]
, que apunta al contexto donde se creó.
Sin embargo, una función creada con new Function
tiene su [[Environment]]
apuntando al entorno global, no al contexto léxico actual. Esto significa que no puede acceder a variables externas, solo a las globales.
Por ejemplo:
function getFunc() {
let valor = "test";
let func = new Function('alert(valor)');
return func;
}
getFunc()(); // Error: valor no está definido
Comparado con el comportamiento normal:
function getFunc() {
let valor = "test";
let func = function() { alert(valor); };
return func;
}
getFunc()(); // "test", obtenido del entorno léxico de getFunc
Ventajas de la Sintaxis new Function
Aunque pueda parecer extraña, esta característica es bastante útil. Imagina que necesitas crear una función a partir de una cadena de texto y que esta cadena puede cambiar durante la ejecución del script. Podrías recibir esta cadena desde un servidor u otra fuente dinámica.
Si new Function
pudiera acceder a variables locales externas, se complicaría el uso de herramientas de minificación que optimizan el código JavaScript para producción. Estas herramientas renombran las variables locales para hacer el código más compacto. Si una función creada dinámicamente pudiera acceder a estas variables renombradas, el código minificado no funcionaría correctamente.
Usar new Function
asegura que solo se puede acceder a variables globales, evitando estos problemas y promoviendo una arquitectura de código más robusta.
Para pasar datos a una función creada con new Function
, simplemente se deben usar sus argumentos.
Resumen
La sintaxis para crear una función es:
let func = new Function([arg1, arg2, ...argN], functionBody);
También se pueden pasar los argumentos como una lista separada por comas:
Estas tres declaraciones son equivalentes:
new Function('a', 'b', 'return a + b'); // sintaxis básica
new Function('a,b', 'return a + b'); // separación por comas
new Function('a , b', 'return a + b'); // separación por comas con espacios
Las funciones creadas con new Function
tienen su [[Environment]]
apuntando al contexto global, lo que significa que no pueden acceder a variables locales externas. Esta limitación previene errores y facilita la minificación del código, ya que evita problemas con variables renombradas. Pasar parámetros explícitamente es una práctica recomendada que mejora la claridad y robustez del código.