Maison > Article > interface Web > Pourquoi mon code JavaScript échoue-t-il lors de l'utilisation de « setTimeout » avec des expressions de fonction ?
En JavaScript, l'exécution du code implique deux phases : la compilation et l'évaluation. Le premier exemple échoue en raison d'un malentendu fondamental entre les déclarations de fonction et les expressions concernant ces phases.
Déclarations de fonction utilisez le mot-clé function et suivez le syntaxe :
function name (arguments) {code}
Les expressions de fonction, en revanche, sont écrites dans un contexte d'expression et suivent la même syntaxe que les déclarations, sauf qu'elles sont placées entre parenthèses. Les expressions sont traitées lors de l'exécution, pas de la compilation.
Exemple 1 :
(function() { setTimeout(someFunction1, 10); var someFunction1 = function() { alert('here1'); }; })();
Compilation : SomeFunction1 est défini comme indéfini.
Exécution : setTimeout est appelé avec la valeur indéfinie de someFunction1.
Exemple 2 :
(function() { setTimeout(someFunction2, 10); function someFunction2() { alert('here2'); } })();
Compilation : SomeFunction2 est déclarée comme une fonction..
Exécution : setTimeout est appelé avec la fonction someFunction2 compilée.
Exemple 3 :
(function() { setTimeout(function() { someFunction3(); }, 10); var someFunction3 = function() { alert('here3'); }; })();
Compilation : SomeFunction3 est initialement définie comme non définie.
Exécution : Une fonction anonyme est passée à setTimeout, créant une fermeture à someFunction3. Plus tard, someFunction3 se voit attribuer une fonction, qui remplace sa valeur non définie.
Exemple 4 :
(function() { setTimeout(function() { someFunction4(); }, 10); function someFunction4() { alert('here4'); } })();
Semblable à l'exemple 2, someFunction4 est déclarée avant d'être transmise à setTimeout.
Le premier exemple échoue car someFunction1 n'est pas déclaré avant d'être transmis à setTimeout lors de la compilation. Les expressions de fonction doivent être évaluées lors de l'exécution, une fois les déclarations traitées. Par conséquent, l'ordre des expressions est crucial lors de l'utilisation d'expressions de fonction, en particulier lorsqu'elles sont transmises à des fonctions asynchrones comme setTimeout.
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!