Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

122
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda