Maison >interface Web >js tutoriel >Analyse approfondie du mécanisme d'exécution des événements dans JS
Cet article vous donnera une compréhension approfondie du mécanisme d'exécution d'événements en JavaScript en analysant la séquence d'impression d'un morceau de code. J'espère qu'il vous sera utile !
J'étais un peu confus à propos d'une question de test écrit il y a quelque temps. Aujourd'hui, nous allons analyser en profondeur le mécanisme d'exécution d'événements de JS. [Recommandations associées : Tutoriel d'apprentissage Javascript]
Les amis peuvent essayer d'écrire l'ordre d'impression
JS
Principalement En tant que langage de script de navigateur, l'objectif principal de Js
est de faire fonctionner le DOM, qui détermine que JS
doit être monothread si JScode> est comme Java. Il est également multithread. Si deux threads exploitent le DOM en même temps, comment le navigateur doit-il l'exécuter ? <code>JS
主要作为浏览器的脚本语言,Js
的主要用途是操作DOM,这就决定了JS
必须是单线程,如果JS
如Java一样是多线程,如果两个线程同时操作DOM,那么浏览器应该怎么执行呢?
JS
的发布其实是为了蹭Java的热度,其中编写这门语言的时间并不久,所以这也就是为什么JS是单线程的原因
JS既然是单线程,那么必然会对任务进行一个排序。所有的任务都将按照一个规则执行下去。
同步任务
异步任务
同步任务和异步任务进入执行栈中,JS会先判断任务的类型
是同步任务,直接进入主线程
是异步任务,进入Event Table
中,注册回调函数Event Queue
同步任务全部执行结束,JS会Event Queue
中读取函数执行
这个过程会反复执行,直到全部任务执行结束。这就是我们常说的事件循环
emmmm,我不知道。。。。JS应该有一套自己独有的逻辑去判断执行栈是否为空。
异步的任务执行顺序为:宏任务——>微任务
异步任务可分为
宏任务
微任务
I/0
setTimeout
setInterval
Promise
.then
.catch
vite 之前配置的一个插件,版本有些问题,不要管这个红色报警
开始了
是一个同步任务,最先进入执行栈中
执行task()
函数, a
是一个同步任务,进入执行栈中
async/await 是异步转同步的过程,第一行代码会同步执行,以下的代码会异步。b
作为一个同步任务进入执行栈中
a end
成为了异步任务的微任务,进入执行栈中,
目前为止,同步任务队列依次是 开始了
, a
, b
目前为止,异步任务队列依次是 宏任务: setTimeout
微任务:a end
那么问题来了,不是说宏任务会比微任务提前执行吗,为什么setTimeout
打印在a end
之后呢?
看这张图
setTimeout 作为了宏任务进入了任务队列。所以造成了这种原因
通俗来讲:
async await 导致了微任务的产生,但是这个微任务所属于当前的宏任务。所以会先执行a end
,执行完毕判断当前宏任务结束。执行下一个宏任务,打印出了setTimeout
c
由于Promise的转化,变为同步任务进入到任务队列中
c end
作为Promise衍生的微任务进入任务队列
d
JS
vise en fait à profiter de la popularité de Java. Le langage a été écrit il n'y a pas longtemps, c'est pourquoi JS est monothread🎜Event Table
et enregistrez la fonction de rappel Event File d'attente
🎜Event Queue
et l'exécutera🎜boucle d'événements
🎜Démarré est une tâche synchrone et est la première à entrer dans la pile d'exécution 🎜
task()
a
. tâche synchrone et entre en exécution. 🎜b
entre dans la pile d'exécution en tant que tâche synchrone 🎜a end
devient une microtâche de la tâche asynchrone et entre dans la pile d'exécution, 🎜 li>Démarrée
, a
, b
🎜🎜🎜🎜Jusqu'à présent, La la file d'attente des tâches asynchrones est une macro-tâche en séquence : setTimeout
Micro-tâche : une fin
🎜🎜setTimeout
est-il imprimé après une fin
? 🎜🎜Regardez cette photo
🎜🎜🎜🎜setTimeout entre dans la file d'attente des tâches en tant que tâche macro. La raison est donc 🎜🎜En termes simples : 🎜🎜async wait conduit à la génération de micro-tâches, mais cette micro-tâche appartient à la macro-tâche actuelle. Par conséquent, une fin
sera exécutée en premier, et après l'exécution, il sera jugé que la macro-tâche en cours est terminée. Exécutez la tâche macro suivante et imprimez setTimeout
🎜 c
En raison de la conversion de Promise, elle devient une tâche synchrone et entre dans la file d'attente des tâches🎜c end
Entre dans la file d'attente des tâches en tant que micro-tâche dérivée from Promise🎜d
entre dans la file d'attente des tâches en tant que tâche de synchronisation🎜a fin micro Tâche
c end Micro task
setTimeout Macro task
Donc, l'ordre d'impression est le suivant
front-end Web
】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!