Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

186
Vistas
Se perdió el valor de cierre de la función de JavaScript

Los valores de cierre se pierden en una función que se pasa como devolución de llamada a otra función definida por el new Function() .

Código

¿Cómo se puede arreglar la función baz() para acceder a los valores de cierre en la devolución de llamada?

Nota: La función foo() no se puede modificar.

 const foo = () => { const b = 2; return (a) => { return a + b; // unable to access `b` here }; }; const bar = (a = 1, callback = foo()) => callback(a); const baz = new Function(["a = 1", `callback = ${foo()}`], "return callback(a)"); console.log(bar(1)); // works fine and prints 3 console.log(baz(1)); // throws Uncaught ReferenceError: b is not defined

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

No utilice la interpolación de cadenas con una función. Lo que está pasando se puede ver aquí:

 const foo = () => { const b = 2; return (a) => a+b; }; console.log(new Function(["a = 1", `callback = ${foo()}`], "return callback(a)"))

La función (a) => a+b se convierte en una cadena, que luego se coloca en el código fuente de la nueva función. Sí, esto pierde el cierre, pierde todo el objeto de función.

En su lugar, simplemente escriba

 const foo = () => { const b = 2; return (a) => a+b; }; const bar = function(a = 1, callback = foo()) { return callback(a); }; const baz = new Function(["a = 1", "callback = foo()"], "return callback(a)"); console.log(bar(1)); console.log(baz(1)); console.log(bar); console.log(baz);

Como puede ver en las funciones registradas, su código ahora es equivalente, y dado que todo en el fragmento de código de demostración es global, también funcionan de la misma manera.

Es un poco diferente cuando foo (o cualquier otra cosa a la que desee acceder desde la cadena de código de función) se define en un ámbito local. En ese caso, necesitará usar un truco como este para hacer que el valor esté explícitamente disponible para el código generado dinámicamente.

about 4 years ago · Juan Pablo Isaza Denunciar

0

Creo que los constructores de funciones solo se ejecutan dentro del alcance global y no crean cierres. Esta respuesta puede ayudarte:

Constructor de funciones MDN

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda