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

120
Vistas
¿Es posible usar el alcance de cierre de una función que recibe datos como argumento?

Hay una función que espera una función de devolución de llamada que recibe un argumento de datos. Necesito una forma de acceder a foo dentro de la devolución de llamada. Al leer, descubrí que los ámbitos de cierre pueden ser la solución, sin embargo, estaba luchando por encontrar un ejemplo en el que la devolución de llamada también reciba un objeto de datos (o cualquier variable).

 const foo = 1; this.editor.functionThatExpectsCallback('genericString', (data) => { // do stuff with foo here, eg const bar = foo + data.num; return bar; })

Básicamente, el problema es que foo no está definido dentro del alcance de devolución de llamada, y necesito que se defina, al mismo tiempo que se mantiene el acceso a los datos. Realmente agradecería cualquier ayuda que pueda obtener aquí. Si necesita más información, con gusto se la proporcionaré.

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

0

Su código actual es correcto porque así es como funcionan los ámbitos : cualquier cosa desde un ámbito externo es visible dentro de uno interno.

La única razón por la que no funcionaría es si la función se serializara y luego se deserializara, lo que elimina por completo toda la información del alcance:

 { //different scope here const foo = 1; const result = functionThatExpectsCallback('genericString', (data) => { // do stuff with foo here, eg console.log("foo is:", typeof foo); const bar = foo + data.num; return bar; }); console.log(result); } //dummy implementation that serialises and deserialises a function to run it: function functionThatExpectsCallback(arg, callback) { return runFromString(callback.toString()); } function runFromString(strFunc) { const fn = eval(`(${strFunc})`); return fn({ num: 2 }); }

La primera forma de resolver esto es revisando la documentación de cualquier biblioteca que se use; podría proporcionar una forma de enviar también argumentos adicionales.

Si esa no es una opción, entonces deberá hacerlo de la manera sucia y generar la función a partir de una cadena. Puedes usar el constructor de Function para hacer eso

 { //different scope here const foo = 1; const generatedFunction = new Function("data", ` // do stuff with foo here, eg const bar = ${foo} + data.num; return bar; `); const result = functionThatExpectsCallback('genericString', generatedFunction); console.log(result); } function functionThatExpectsCallback(arg, callback) { return runFromString(callback.toString()); } function runFromString(strFunc) { const fn = eval(`(${strFunc})`); return fn({ num: 41 }); }

Debe tener mucho cuidado porque es fácil introducir errores menores al generar una función a partir de una cadena y puede terminar con un código no válido. Por ejemplo, si foo fuera una cadena foo = "hello" , el código generado sería const bar = hello + data.num; lo cual no es válido porque hello sería una variable que nunca se definió, en lugar de la cadena literal "hello" .

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