Combien de programmes JavaScript sont exécutés pour une seule page Web dans le navigateur?

StackOverflow https://stackoverflow.com/questions/3735406

  •  03-10-2019
  •  | 
  •  

Question

Les programmes JavaScript consistent en des déclarations et des déclarations de fonction. Quand est exécuté, ces deux étapes se déroulent un programme JavaScript:

  1. le code est balayé pour les déclarations de fonction, et chaque func. déclaration est « exécutée » (en créant un objet de fonction) et une référence nommée à cette fonction est créée (de sorte que cette fonction peut être appelée dans une instruction)

  2. les instructions sont exécutées (évaluées) de manière séquentielle (tels qu'ils apparaissent dans le code)

En raison de cela, ce fonctionne très bien :

<script>
    foo();
    function foo() {
        return;
    }
</script>

Bien que la fonction « foo » est appelée avant qu'elle ne soit déclarée, cela fonctionne parce que la déclaration de fonction est évaluée avant l'instruction.

Cependant, cette ne fonctionne pas :

<script>
    foo();
</script>
<script>
    function foo() {
        return;
    }
</script>

A ReferenceError sera jeté ( "foo n'est pas défini"). Cela conduit à la conclusion que chaque élément SCRIPT dans le code HTML de la page Web représente un programme JavaScript distinct et chaque fois que l'analyseur HTML rencontre un élément SCRIPT, il exécute le programme à l'intérieur de cet élément (et une fois que le programme est exécuté, l'analyseur passe au code HTML qui suit l'élément SCRIPT).

Là encore, cette fonctionne :

<script>
    function foo() {
        return;
    }
</script>
<script>
    foo();
</script>

Je crois comprendre ici est que l'objet global (qui sert de l'objet variable dans le contexte d'exécution global) existe (et reste) en tout temps, de sorte que le premier programme JavaScript va créer l'objet de fonction et faire une référence pour lui, puis le deuxième programme JavaScript utilisera cette référence pour appeler la fonction. Par conséquent, tous les programmes JavaScript (dans une seule page Web) « utilisation » le même objet global, et toutes les modifications faites à l'objet global d'un programme JavaScript peut être observé par tous les programmes JavaScript qui fonctionnent par la suite.

, notez ceci ...

<script>
    // assuming that foo is not defined
    foo();
    alert(1);
</script>

Dans le cas ci-dessus, l'appel d'alerte n'exécutera , car l'instruction « foo () » jette un ReferenceError (qui rompt l'ensemble du programme JavaScript) et, par conséquent, toutes les instructions suivantes ne pas exécuter .

Cependant, dans ce cas ...

<script>
    // assuming that foo is not defined
    foo();
</script>
<script>
    alert(1);
</script>

Maintenant, l'appel d'alerte ne soit exécuté . Le premier programme JavaScript jette un ReferenceError (et comme conséquence les pauses), mais le second programme JavaScript fonctionne normalement. Bien sûr, le navigateur signale l'erreur (même si elle a fait exécuter des programmes ultérieurs JavaScript, après l'erreur).

Maintenant, mes conclusions sont les suivantes:

  • tous les éléments SCRIPT dans le code HTML de la page Web représente un programme JavaScript distinct. Ces programmes exécutent immédiatement les rencontres de l'analyseur HTML eux.
  • tous les programmes JavaScript dans la même page web « utilisation » le même objet global. Cet objet global existe en tout temps (à partir du moment où la page web est en place jusqu'à ce que les cheveux de la page web est détruite). programmes JavaScript peuvent manipuler l'objet global et toutes les modifications effectuées à l'objet global d'un programme JavaScript peut être observé dans tous les programmes JavaScript ultérieurs.
  • si un programme JavaScript pauses (en ayant une erreur renvoyée), qui ne l'empêche pas de programmes ultérieurs JavaScript pour exécuter.

S'il vous plaît vérifier les faits ce poste et me dire si je suis quelque chose de mal.

En outre, je ne l'ai pas trouvé les ressources qui expliquent les comportements mentionnés dans ce poste, et je suppose que les fabricants de navigateurs doivent avoir publié quelque part ces ressources, donc si vous les connaissez, s'il vous plaît fournir les liens vers eux.

Était-ce utile?

La solution

Dmitry Soshnikov a répondu à votre question. Chaque élément <script> est exécuté comme un programme, tel que défini par la spécification ECMAScript. Il y a un objet global que chaque programme au sein d'une utilisation d'une seule page. Et c'est vraiment.

Autres conseils

Fonction levage - le processus qui permet d'évaluer function déclarations avant le reste de la fonction - fait partie de la norme ECMAScript IIRC (je ne peux pas trouver une référence en ce moment, mais je me souviens avoir vu des discussions de EMCAScript qui mentionnent). L'évaluation des balises script fait partie de la norme HTML. Il ne précise pas qu'ils sont des « programmes distincts » en tant de mots, mais il ne dit que les éléments de script sont évalués dans l'ordre où ils apparaissent dans le document. Voilà pourquoi les fonctions dans les balises de script ultérieures ne sont pas hissées: Le script n'a pas encore été évalué. Cela explique aussi pourquoi un arrêt de script ne coupe pas les scripts suivants:. Lorsque le script en cours arrête l'évaluation, les prochains un début

Ce sont des programmes distincts, mais ils modifient un objet global partagé.

Une autre façon de penser à ce sujet est pseudo locale vs portée globale. Chaque déclaration SCRIPT a une portée locale à sa méthodes / fonctions actuelles, ainsi que l'accès au courant (précédemment déclarée) de portée mondiale. Chaque fois que la méthode est définie / fonction dans un bloc SCRIPT, il est ensuite ajouté à la portée mondiale et devient accessible par les blocs SCRIPT après.

De plus, voici une autre référence de W3C sur le script déclaration / manipulation / modification:

  

La modification dynamique d'un document   peut être modélisé comme suit:

     
      
  1. Tous les éléments SCRIPT sont évalués afin que le document est chargé.
  2.   
  3. Tous les constructions de script dans un élément SCRIPT donné qui génèrent   SGML CDATA sont évalués. Leur   texte généré combiné est inséré dans   le document en place du SCRIPT   élément.
  4.   
  5. Le CDATA généré est réévaluées.
  6.   

Cette est une autre bonne ressource sur le script / évaluation de la fonction / déclaration .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top