Maison > Questions et réponses > le corps du texte
De ReferenceError : impossible d'accéder à la déclaration lexicale 'X' avant l'initialisation - JavaScript MDN, voici un exemple d'importation invalide :
a.js
(module d'entrée) :
import { b } from "./b.js"; export const a = 2;
b.js
:
import { a } from "./a.js"; console.log(a); // ReferenceError: Cannot access 'a' before initialization export const b = 1;
MDN explique :
Dans cet exemple, la variable importée
.a
est accédée, mais pas initialisée, car l'évaluation dea
被访问,但是未初始化,因为a.js
的评估被当前模块b.js
est bloquée par l'évaluation du module actuel
a.js
Je comprends que cela signifie qu'importer un module signifie intégrer le code du module dans la ligne de l'instruction d'importation. Autrement dit, lors de la compilation,
console.log(a); // ReferenceError: Cannot access 'a' before initialization const b = 1; const a = 2;
a.js
Cette compréhension est-elle correcte ? Je ne vois pas cela expliqué dans import - JavaScript MDN. En raison de la promotion variable, je ne sais pas comment tester cela car la réorganisation des lignes dans ne change pas le résultat. 🎜P粉1658237832023-09-17 00:53:49
Le code des modules importés n'est pas simplement intégré (« collé ») mais existe dans une fermeture distincte. Bien qu'il s'agisse certainement d'une simplification excessive, je compare les modules aux fonctions et aux export
语句与其return
instructions :
function a_js() { var b = b_js(); // 不必要的行 return 2; } function b_js() { var a = a_js(); console.log(a); return 1; }
<button onclick="a_js()">import a.js</button> <button onclick="b_js()">import b.js</button>
Étant donné que les modules s'importent les uns les autres, ils ne peuvent pas être chargés dans n'importe quel ordre : appuyer sur n'importe quel bouton entraînera une erreur "Taille maximale de la pile d'appels dépassée".
Mais si vous supprimez les lignes inutiles (remplissez simplement une variable locale qui est ensuite supprimée), cela fonctionnera.