Est-ce que le contexte d'exécution global initial a été éliminé de la pile d'appels en JavaScript?

Le «contexte initial d'exécution globale» a-t-il été éliminé de la pile d'appels en JavaScript? Je parle du contexte d'exécution qui se trouve au bas de la pile en tout temps.

Si c'est le cas, je suppose que cela signifie qu'il est poussé sur la pile avant qu'un rappel ne soit récupéré sur la file d'attente de travail?

Alternativement, est-ce la chaîne [[Scope]].outer permet d'accéder à l'environnement global chaque fois qu'un rappel est poussé sur la pile?

Le «contexte initial d'exécution globale» a-t-il été éliminé de la pile d'appels en JavaScript? Je parle du contexte d'exécution qui se trouve au bas de la pile en tout temps.

Oui, ça l'est. Une pile de contexte d'exécution vide est l'exigence pour les travaux à exécuter .

Cependant, il n'existe pas de «contexte d'exécution global initial», et comme la pile peut être vide, il n'y a pas de contexte unique au fond de la pile tout le temps.

Les «contextes d'exécution globale» sont créés dans ScriptEvaluations . Chaque script a son propre scriptCxt , mais tous dans un domaine partagé portent les mêmes enregistrements environnementaux globaux . scriptCtx ces scriptCtx s ne sont pas au bas de la pile.

Un «contexte d'exécution initiale» qui se trouve au bas de la pile est créé dans le processus d' initialisation ECMAScript . C'est tout à fait insignifiant, car il ne contient que le nouveau domaine et sert uniquement de contexte pour l' initialisation du domaine et de l'objet global , mais il est également utilisé pour démarrer les files d'attente.

Si c'est le cas, je suppose que cela signifie qu'il est poussé sur la pile avant qu'un rappel ne soit récupéré sur la file d'attente de travail?

Oui en effet. Nous pouvons voir cela à partir des instructions pour les étapes de l' algorithme NextJob . Ceux-ci sont effectués à la fin de l'initialisation ECMAScript et la fin de chaque travail, et se lisent essentiellement comme suit:

  1. Suspendez le contexte d'exécution actuel et faites-le apparaître à partir de la pile afin que la pile soit vide.
  2. Obtenez le prochain travail à partir de n'importe quelle file. S'il n'y en a plus, procédez comme vous le souhaitez (c.-à-d., Généralement, ferme le processus).
  3. Créez un nouveau contexte vide (à l'exception du domaine du travail) newContext et placez-le au bas de la pile
  4. Exécutez le travail sélectionné dans ce contexte (qui démarre sur NextJob à la fin)

Ces contextes servent de base pour chaque travail, contenant toutes les exécutions qui se produisent. Dans PromiseJobs , ils sont utilisés plutôt directement, tandis que dans les travaux d'évaluation de module et de script, d'autres contextes seront poussés sur la pile qui servent à conserver les enregistrements environnementaux respectifs avec lesquels le code doit être exécuté.

Alternativement, est-ce la chaîne externe [[Scope]]. Qui permet d'accéder à l'environnement global chaque fois qu'un rappel est poussé sur la pile?

Oui en effet. La chaîne de portée (qui ne doit pas être confondue avec la pile de contexte d'exécution) fournit un accès de partout à l'environnement global, qui se trouve à la fin de chaque chaîne de portée.