Quiero poder exportar y luego modificar un objeto. Sin embargo, no estoy seguro de si se trata de un comportamiento inesperado.
prueba.js:
// Short syntax export const foo = []; foo[0] = 1; // Long syntax const bar = []; bar[0] = 1; export { bar };índice.js:
import { foo, bar } from "./test.js"; console.log("foo:" + foo); // Is it guaranteed to be [1]? Or can it be []? console.log("bar:" + bar); // I always expect this to be [1].Este podría ser un ejemplo tonto, pero a veces tengo un objeto y quiero registrar algunos métodos/propiedades. Quiero saber si puedo exportarlo y luego registrarlos.
¿Se evalúan los módulos ES hasta el final antes de exportarlos?
No. De hecho, las exportaciones se declaran y registran antes de que se evalúe el módulo.
Sin embargo, lo que en realidad parece estar preguntando es
¿Se evalúan los módulos ES hasta el final antes de evaluar los módulos que los importan?
Sí. test.js se evaluará por completo antes de que se evalúe index.js 1 . No importa en qué parte del módulo coloque las declaraciones de import y export .
1: con la excepción de las dependencias circulares. En ese caso, un módulo podría ejecutarse antes de que se evalúen todos los módulos importados y podría encontrarse con variables no inicializadas .
¿Está garantizado que sea
[1]? ¿O puede ser[]?
Sí, se garantiza que sea [1] (o una excepción que const foo aún no se haya inicializado). Nunca será [] , the = [] y foo[0] = 1 siempre se ejecutan uno después del otro.