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

251
Visualizações
Cuando las exportaciones de ES6 con nombre se mutan de forma asíncrona, ¿por qué los importadores detectan el cambio?

Considere el siguiente ejemplo:

 // module.mjs export let member = "initial" setTimeout(() => { member = "mutated" }, 2000)
 // index.mjs import { member } from "./module.mjs" setInterval(() => { console.log(member) }, 300);

Si ejecuta index.mjs , imprime "initial" varias veces y después del tiempo de espera de 2 segundos comienza a imprimir "mutated" .

Esto es sorprendente para mí. Esperaba que siguiera imprimiendo "initial" ya que la referencia al member ha cambiado. No me sorprendería si mi index.mjs se viera así

 // index.mjs import * as allExports from "./module.mjs" setInterval(() => { console.log(allExports.member) }, 300);

La referencia a allExports no ha cambiado. Entonces, al acceder al member como una propiedad, tengo acceso a la nueva referencia. Y bastante justo, esto produce el mismo resultado.

Pero, ¿por qué funciona también en el primer caso? ¿Se actualizan las referencias de importación cada vez que se construye el contexto para una llamada de función? Bueno, entonces también debería funcionar con exportaciones predeterminadas. Sin embargo, después de ajustar el código de esta manera:

 // module.mjs let member = "initial" export default member setTimeout(() => { member = "mutated" }, 2000)
 // index.mjs import member from "./module.mjs" setInterval(() => { console.log(member) }, 300);

index.mjs sigue imprimiendo "initial" según mi intuición. Hmm, tal vez haya una diferencia fundamental entre las exportaciones predeterminadas y las exportaciones con nombre. ¿Qué pasa si hago esto?

 // module.mjs export let member = "initial" setTimeout(() => { member = "mutated" }, 2000)
 // index.mjs import * as allExports from "./module.mjs" let { member } = allExports setInterval(() => { console.log(member) }, 300);

Wow, sigue imprimiendo "initial" . Aquí es donde me confundí mucho. siempre supuse que

 import { member } from "./module.mjs"

es simplemente la abreviatura de importar todas named-exports como un objeto y luego hacer la desestructuración.

Entonces mi pregunta es: ¿qué principio subyacente justifica este comportamiento único de named-exports ?

about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

La razón de esto es que técnicamente los módulos ES6 exportan e importan enlaces y no valores. Cuando tu lo hagas:

 export let test = 0

Debe pensar que está exportando test no 0 . Eso significa que cualquier cambio en la variable se reflejará en sus importaciones.

La razón por la que esto sigue imprimiendo initial :

 // index.mjs import * as allExports from "./module.mjs" let { member } = allExports setInterval(() => { console.log(member) }, 300);

Es porque allExports es un objeto especial . Está creando un nuevo enlace aquí y el valor se copia, pero está perdiendo el enlace importado.

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