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 :
-
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).
-
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.