Dans le processus d'apprentissage de JavaScript, la synchronisation et l'asynchronisme sont deux concepts très gênants, surtout pour les débutants. En termes simples, lorsque deux ou plusieurs choses se produisent en même temps, cela s’appelle synchronisation ; lorsqu’elles ne se produisent pas en même temps, cela s’appelle asynchrone.
Bien que ces deux concepts semblent simples, il faut beaucoup d'efforts pour réellement les comprendre. Nous devons comprendre, à travers des opérations réelles, quelles situations sont synchrones et quelles situations sont asynchrones.
Vous pensez peut-être que les fonctions JavaScript ordinaires sont synchrones. Lorsque vous utilisez setTimeout() et AJAX, vous pouvez aussi penser qu'ils sont synchrones, n'est-ce pas ? Si je vous disais que ces deux fonctions peuvent aussi être asynchrones à certains moments, le croiriez-vous ?
Pour expliquer clairement la raison, nous avons besoin de l'aide de M. X.
Scénario 1 : Monsieur tâches assignées.
Quand vous posez des questions, il écoute ; quand il donne des réponses, vous écoutez en même temps.
Alors, comment Monsieur X peut-il gérer cette situation ?
1 Mr X engage un assistant Mr M et est équipé d'un répondeur.
On peut dire que c'est les deux. Lorsque vous laissez un message sur le répondeur, Monsieur X n'écoute pas, il s'agit donc d'une communication asynchrone.
Vous devez maintenant comprendre la communication synchrone et asynchrone. Parlons maintenant de la synchronisation et de l'asynchronisme en JavaScript.
JavaScript – un langage de programmation asynchrone
Quand quelqu'un dit que JavaScript est un langage asynchrone, cela veut dire qu'en général, lorsque vous utilisez JavaScript, vous devez Il prend des messages, et quand vous l'appelez, vous n'entendez pas de tonalité occupée.
Les appels de fonction en JavaScript ne se produisent jamais directement, ils se font via des messages.
JavaScript utilise une file d'attente de messages, où les nouveaux messages (ou événements) entrants sont temporairement stockés. La boucle d'événements traite en permanence ces messages et les envoie à la pile d'appels, où les fonctions de message correspondantes sont empilées dans des trames pour exécution (les variables indépendantes et dépendantes de la fonction).
La pile d'appels contient le cadre de la première fonction appelée, ainsi que les cadres d'autres fonctions appelées via des appels imbriqués au-dessus de cette fonction.
Lorsqu'un message est ajouté à la file d'attente, il attendra que le cadre de message précédent dans la pile d'appels ait été traité. Une fois le message précédent traité, la boucle d'événements le supprimera de la file d'attente, puis ajoutera la trame correspondante du message actuel à la pile d'appels.
Ce message recommence à attendre, demandant à la pile d'appels d'effacer sa trame correspondante, puis d'être supprimée de la file d'attente.
Regardez le code suivant :
function foo(){}function bar(){ foo(); }function baz(){ bar(); } baz();
La fonction exécutée ici est baz(), située à la dernière ligne du segment de code. Elle sera ajoutée à la file d'attente en tant que segment. message. Lorsque l'événement - Lorsque la boucle le récupère, la pile d'appels commence à empiler les trames pour baz(), bar() et foo() pendant l'exécution.
Une fois l'exécution des fonctions terminée, leurs trames seront supprimées de la pile d'appels et le message attendra toujours dans la file d'attente jusqu'à ce que baz() soit sur le la pile a été éjectée.
N'oubliez pas que les appels de fonctions en JavaScript ne se font jamais directement, mais via des messages.
Quelles sont ces méthodes asynchrones spécifiques ?
Jusqu'à présent, j'ai rencontré certaines API, telles que setTimeout() et AJAX, qui sont spécifiquement indiquées comme méthodes asynchrones. Que se passe-t-il?
Une chose très importante est de comprendre quelles choses se produisent de manière synchrone et lesquelles se produisent de manière asynchrone. À l'aide d'événements et de boucles d'événements, JavaScript peut traiter les messages de manière asynchrone, mais cela ne signifie pas que tout dans JavaScript est asynchrone.
J'ai déjà dit que le message ne quittera pas la file d'attente tant que la pile d'appels n'effacera pas la trame correspondante. Par exemple, c'est comme si vous ne sortiez pas pour regarder un film avant d'avoir obtenu la réponse - ce qui se passe à ce moment-là est synchrone : vous restez là à attendre que la tâche soit terminée et ne partez qu'après avoir vu la tâche terminée avec votre propres yeux.
Ce qui précède est la synchronisation et le contenu asynchrone de JavaScript. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !