Maison > interface Web > js tutoriel > Pourquoi `setTimeout` ne parvient-il pas à s'exécuter avec une expression de fonction assignée à une variable avant qu'elle ne soit déclarée, mais réussit-il avec les déclarations de fonction ?

Pourquoi `setTimeout` ne parvient-il pas à s'exécuter avec une expression de fonction assignée à une variable avant qu'elle ne soit déclarée, mais réussit-il avec les déclarations de fonction ?

DDD
Libérer: 2024-10-25 01:56:02
original
631 Les gens l'ont consulté

Why does `setTimeout` fail to execute with a function expression assigned to a variable before it's declared, but succeeds with function declarations?

Déclaration de fonction JavaScript et ordre d'évaluation

Problème :

Pourquoi l'exemple JavaScript suivant ne parvient-il pas à s'exécuter ?

<code class="javascript">(function() {
  setTimeout(someFunction1, 10);
  var someFunction1 = function() { alert('here1'); };
})();</code>
Copier après la connexion

Alors que d'autres exemples similaires fonctionnent comme prévu :

<code class="javascript">(function() {
  setTimeout(someFunction2, 10);
  function someFunction2() { alert('here2'); }
})();

(function() {
  setTimeout(function() { someFunction3(); }, 10);
  var someFunction3 = function() { alert('here3'); };
})();

(function() {
  setTimeout(function() { someFunction4(); }, 10);
  function someFunction4() { alert('here4'); }
})();</code>
Copier après la connexion

Solution :

Le problème réside dans l'ordre d'évaluation entre les déclarations de fonction et expressions de fonction.

Déclaration de fonction vs expression

  • Déclaration : Déclare une fonction à l'aide du mot-clé de fonction (par exemple, fonction someFunction( ) {}). Les déclarations de fonction sont traitées pendant la phase de compilation.
  • Expression : Crée une fonction à l'aide d'une expression qui s'évalue en une fonction (par exemple, () => {} ). Les expressions de fonction sont traitées lors de la phase exécution.

Ordre d'évaluation

Le code JavaScript subit deux phases de traitement :

  1. Compilation : Les variables sont créées et les déclarations de fonction sont traitées.
  2. Exécution : Les expressions de fonction et autres codes sont exécutés.

Analyse des exemples

  • Exemple 1 :

    • La fonction someFunction1 est créée en tant que expression de fonction pendant la phase d'exécution.
    • La fonction setTimeout est appelée avant que someFunction1 soit entièrement évaluée et affectée à la variable someFunction1.
    • La fonction setTimeout reçoit une valeur non définie pour someFunction1 et ne parvient pas à s'exécuter.
  • Exemples 2, 3 et 4 :

    • Dans chacun de ces exemples, la fonction est déclaré à l'aide du mot-clé function, ce qui en fait une déclaration de fonction.
    • Les déclarations de fonction sont traitées pendant la phase de compilation, elles existent donc avant l'appel de la fonction setTimeout.
    • La fonction setTimeout reçoit une référence de fonction valide et s'exécute avec succès.

Clarification supplémentaire

  • Les arguments de fonction en JavaScript sont toujours transmis par valeur, ce qui signifie que la fonction setTimeout ne fait pas directement référence à la variable someFunction1 mais plutôt à une copie de la fonction à laquelle elle fait référence.

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 de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal