Maison  >  Article  >  interface Web  >  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
DDDoriginal
2024-10-25 01:56:02498parcourir

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>

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>

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