setTimeout(fn,200)
, le temps spécifié ici signifie-t-il qu'il est calculé dès le démarrage du programme ? Ou devrions-nous attendre que la tâche du thread principal soit terminée et rappeler la liste des tâches asynchrones avant de lancer le calcul ?
C'est un peu compliqué à expliquer
Tout d'abord, vous devez comprendre que Javascript est monothread, ce qui signifie que toutes les tâches doivent être mises en file d'attente. Ensuite toutes les tâches seront divisées en deux catégories : les tâches synchrones et les tâches asynchrones ! Tâches synchrones : les tâches exécutées sur le thread principal n'exécuteront la tâche suivante qu'une fois la tâche précédente terminée ! Tâches asynchrones : tâches qui n'entrent pas dans le thread principal mais entrent dans la « file d'attente des tâches ». Lorsque les tâches sur le thread principal sont terminées, le thread principal exécutera la « file d'attente des tâches ».
Pour
setTimeout(fn,200)
,当到200ms时,fn
会被放进“任务队列”,而“任务队列”必须要等到主线程已有的代码执行完才会执行fn
,所以当程序执行到setTimeout(fn,200)
这一行时,时间就开始计算,但是fn
le temps d'exécution réel n'est pas forcément après 200ms, il peut être après un temps plus long (en fonction du temps d'exécution du code de synchronisation sur le thread principal).Pour faire simple
setTimeout(fn,200)
需要等到当前函数调用栈(主进程上的同步任务)清空之后才开始执行,会在下一轮事件循环(主线程从"任务队列"中读取事件)开始时执行,setTimeout
Seul l'événement est inséré dans la "file d'attente des tâches". Le temps défini ici est l'intervalle par rapport au temps de début du prochain tour de boucle d'événements.Le temps commence lorsque
setTimeout(fn,200)
est appelé.