Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

179
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!