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 :
-
Compilation : Les variables sont créées et les déclarations de fonction sont traitées.
-
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!