67 votes

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

Les programmes JavaScript sont constitués d'instructions et de déclarations de fonctions. Lorsqu'un programme JavaScript est exécuté, ces deux étapes se produisent :

  1. le code est analysé à la recherche de déclarations de fonctions, et chaque déclaration de fonction est "exécutée" (par la création d'un objet fonction) et une référence nommée à cette fonction est créée (afin que cette fonction puisse être appelée à l'intérieur d'une déclaration).

  2. les instructions sont exécutées (évaluées) séquentiellement (comme elles apparaissent dans le code)

Pour cette raison, cette fonctionne très bien :

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

Bien que la fonction "foo" soit appelée avant d'être déclarée, elle fonctionne car la déclaration de la fonction est évaluée avant l'instruction.

Cependant, cette ne fonctionne pas :

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

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

Encore une fois, cette fait le travail :

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

Si j'ai bien compris, l'objet Global (qui sert d'objet Variable dans le contexte d'exécution global) existe (et reste) à tout moment, de sorte que le premier programme JavaScript créera l'objet fonction et y fera référence, puis le second programme JavaScript utilisera cette référence pour appeler la fonction. Par conséquent, tous les programmes JavaScript (au sein d'une même page Web) "utilisent" le même objet Global, et toutes les modifications apportées à l'objet Global par un programme JavaScript peuvent être observées par tous les programmes JavaScript qui s'exécutent ensuite.

Maintenant, 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 pas En effet, l'instruction "foo()" déclenche une ReferenceError (qui casse l'ensemble du programme JavaScript) et, par conséquent, toutes les instructions suivantes ne s'exécutent pas.

Cependant, dans ce cas...

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

Maintenant, l'appel d'alerte est exécuté . Le premier programme JavaScript génère une ReferenceError (et se casse par conséquent), mais le second programme JavaScript s'exécute normalement. Bien entendu, le navigateur signalera l'erreur (bien qu'il ait exécuté les programmes JavaScript suivants, après que l'erreur se soit produite).

Maintenant, mes conclusions sont :

  • chaque élément script dans le code HTML de la page Web représente un programme JavaScript distinct. Ces programmes s'exécutent immédiatement lorsque l'analyseur HTML les rencontre.
  • tous les programmes JavaScript d'une même page Web "utilisent" le même objet global. Cet objet global existe à tout moment (depuis le moment où la page Web est extraite jusqu'à sa destruction). Les programmes JavaScript peuvent manipuler l'objet global, et toutes les modifications apportées à l'objet global par un programme JavaScript peuvent être observées par tous les programmes JavaScript suivants.
  • si un programme JavaScript s'interrompt (par l'envoi d'une erreur), cela n'empêche pas les programmes JavaScript suivants de s'exécuter.

Veuillez vérifier cet article et me dire si j'ai fait une erreur.

De plus, je n'ai pas trouvé de ressources qui expliquent les comportements mentionnés dans ce billet, et je suppose que les fabricants de navigateurs doivent avoir publié de telles ressources quelque part, donc si vous en avez connaissance, veuillez fournir les liens vers celles-ci.

1 votes

J'ai supprimé la partie réponse de votre question, car elle n'a pas sa place ici. N'hésitez pas à la poster vous-même comme une réponse appropriée.

19voto

Chuck Points 138930

Le hissage des fonctions - le processus qui évalue function avant le reste de la fonction - fait partie de la norme ECMAScript IIRC (je ne peux pas trouver une référence maintenant, mais je me souviens avoir vu des discussions sur EMCAScript qui le mentionnaient). L'évaluation de script fait partie de la norme HTML. Elle ne précise pas qu'il s'agit de "programmes séparés" en autant de mots, mais elle dit que les éléments script sont évalués dans l'ordre où ils apparaissent dans le document. C'est pourquoi les fonctions dans les balises script ultérieures ne sont pas hissées : Le script n'a pas encore été évalué. Cela explique également pourquoi un script s'arrêtant ne coupe pas les script suivants : Lorsque le script actuel arrête de s'évaluer, le suivant commence.

0 votes

15voto

Tim Down Points 124501

Dmitry Soshnikov a répondu à votre question. Chaque <script> est exécuté comme un programme, tel que défini par la spécification ECMAScript. Il existe un objet global que chaque programme d'une même page utilise. Et c'est tout.

7voto

Mike Stay Points 398

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

4voto

bryan.taylor Points 523

Une autre façon de penser à cela est la portée pseudo locale vs globale. Chaque déclaration script a une portée locale à ses méthodes/fonctions actuelles, ainsi qu'un accès à la portée globale actuelle (précédemment déclarée). Chaque fois qu'une méthode/fonction est définie dans un bloc script, elle est alors ajoutée à la portée globale et devient accessible par les blocs script qui la suivent.

Voici également une autre référence de W3C sur la déclaration/manipulation/modification de script :

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

  1. Tous les éléments script sont évalués dans l'ordre lors du chargement du document.
  2. Toutes les constructions script à l'intérieur d'un élément script donné qui génèrent du SGML CDATA sont évaluées. Leur texte combiné généré est inséré dans le le document à la place de l'élément script. dans le document.
  3. Le CDATA généré est réévalué.

Ce site est une autre bonne ressource sur l'évaluation/déclaration des script/fonctions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X