js异步原理

javascript引擎

javascript引擎执行时单线程的,如果有一个任务被阻塞,整个浏览器就会处于假死状态
那么遇到这种情况,又在单线程的情况下,不能像java之类的语言创建多几个线程来处理,如何解决呢,
js的异步处理就被提出来了
在执行javascript代码中,那些被javascript引擎认为是耗时任务的事件或者定时器,鼠标事件,ajax等,会被特殊处理
而其他的代码(同步代码)则被依次添加到主线程栈中,被javascript引擎依次执行。

那么那些被特殊处理的事件呢

定时器

在定时器被触发时,等到延迟结束,定时器的回调函数就会被添加到任务队列中,先后入队顺序根据延时时间长久

鼠标事件

在触发鼠标事件后,立即被添加进任务队列

ajax等异步请求

在网络请求成功后,回调函数才会被添加到任务队列

那么任务队列什么时候被处理呢

在主线程的同步代码被执行完毕,就会去任务队列查看有没有回调函数,有的话,就加载进入执行栈,开始执行

具体来说,异步运行机制如下:
(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
(4)主线程不断重复上面的第三步。
只要主线程空了,就会去读取"任务队列",这就是JavaScript的运行机制

posted @ 2020-05-31 23:03  ReYiRFW  阅读(586)  评论(0编辑  收藏  举报