Maison  >  Article  >  interface Web  >  Pourquoi ce code JavaScript échoue-t-il, même si des exemples similaires fonctionnent ?

Pourquoi ce code JavaScript échoue-t-il, même si des exemples similaires fonctionnent ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-25 07:59:29461parcourir

Why Does This JavaScript Code Fail, Even Though Similar Examples Work?

Déclaration et ordre d'évaluation des fonctions JavaScript

Contexte :

En JavaScript, les fonctions peuvent être déclaré ou créé à l'aide d'expressions. Les déclarations de fonctions se produisent pendant la phase de compilation, tandis que les expressions de fonction sont évaluées pendant la phase d'exécution. Comprendre cette distinction est crucial pour comprendre le comportement du code JavaScript.

La question :

Pourquoi le premier exemple du bloc de code suivant échoue-t-il, alors que les exemples restants exécuter avec succès ?

<code class="javascript">// 1 - does not work
(function() {
  setTimeout(someFunction1, 10);
  var someFunction1 = function() { alert('here1'); };
})();

// ... other examples</code>

La réponse :

L'échec du premier exemple n'est pas dû à un problème de portée ou de fermeture mais plutôt à un malentendu entre les déclarations et les expressions .

Déclarations de fonction et expressions :

  • Les déclarations de fonction suivent la syntaxe : nom de la fonction (arguments) {code}
  • Les expressions de fonction sont écrites sous forme d'expressions, similaires aux déclarations de fonction, mais évaluées au moment de l'exécution.

Phase 1 : Compilation

Pendant la compilation, le compilateur traite les déclarations de fonctions, créant des variables pour les fonctions. Dans le premier exemple, la variable someFunction1 est créée mais reste indéfinie car sa valeur (le corps de la fonction) est évaluée ultérieurement.

Phase 2 : Exécution

Exemple 1 :

Au moment de l'exécution, l'interpréteur rencontre setTimeout(someFunction1, 10) et tente de transmettre une someFunction1 non définie à setTimeout.

Exemple 2 :

En revanche, la fonction someFunction2() est une déclaration, créant la fonction lors de la compilation. Lorsque setTimeout est appelé, il reçoit la référence de fonction compilée.

Exemple 3 :

Ici, une fonction anonyme est transmise à setTimeout, ce qui crée une fermeture à la variable uneFonction3. Lorsque setTimeout se déclenche, someFunction3 s'est vu attribuer une valeur et la fonction s'exécute avec succès.

Exemple 4 :

Semblable à l'exemple 2, la fonction someFunction4 est déclarée, ce qui rend sa référence est disponible pour setTimeout.

Clarification supplémentaire :

  • Les arguments de fonction en JavaScript sont transmis par valeur pour les types primitifs et par référence pour les objets. Cela signifie que setTimeout ne reçoit pas de fermeture de someFunction.
  • Comprendre la distinction entre les déclarations et les expressions est crucial pour prédire le comportement du code JavaScript.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn