recherche

Maison  >  Questions et réponses  >  le corps du texte

Importer un module signifie-t-il intégrer le code du module sur la même ligne que l'instruction d'importation ?

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 de a被访问,但是未初始化,因为a.js的评估被当前模块b.js est bloquée par l'évaluation du module actuel

.

a.jsJe 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,

devient comme ceci :

console.log(a); // ReferenceError: Cannot access 'a' before initialization
const b = 1;

const a = 2;
a.jsCette 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粉269847997P粉269847997435 Il y a quelques jours425

répondre à tous(1)je répondrai

  • P粉165823783

    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.

    répondre
    0
  • Annulerrépondre