异步机制

同步和异步

  如果函数是同步的,即使调用函数执行的任务比较耗时,也会一直等待直到得到结果

  如果函数是异步的,发出调用后,马上返回,但是不会马上返回预期结果,得到结果之后会通过回调函数主动通知调用者

单线程与多线程

  JavaScript只是一门语言,说是单线程还是多线程得结合具体运行环境,即浏览器,虽然JavaScript是单线程的,可是浏览器内部不是单线程的。

浏览器

  目前最为流行的浏览器为:Chrome、IE、Safari、FireFox、Opera。浏览器的内核是多线程的。

一个浏览器通常有以下几个常驻的线程:

  • 渲染引擎线程:负责页面渲染
  • js引擎线程:负责js的解析和执行
  • 定时触发器线程:处理定时事件
  • 事件触发线程:处理DOM事件
  • 异步http请求线程:处理http请求

渲染线程和js引擎线程不能同时进行

JS引擎

 渲染引擎: 

Chrome/Safari/Opera用的是Webkit引擎,IE用的是Trident引擎,FireFox用的是Gecko引擎。不同的引擎对同一个样式的实现不一致,就导致了经常被人诟病的浏览器样式兼容性问题。

 
 js引擎:
 
不同浏览器的JS引擎也各不相同,Chrome用的是V8,FireFox用的是SpiderMonkey,Safari用的是JavaScriptCore,IE用的是Chakra。
 

消息队列与事件循环

  • 栈存储的是同步任务,如变量和函数的初始化、事件的绑定等那些不需要回调函数的操作
  • 堆用来存储声明的变量、对象。一旦某个异步任务有了响应就被推入队列中,如点击事件、浏览器收到服务器的响应等
  • JS引擎线程用来执行栈中的同步任务,当所有同步任务执行完毕后,栈被清空,然后读取消息队列中的一个待处理任务,并把相关回调函数压入栈中,单线程开始执行新的同步任务

  • JS引擎线程从消息队列中读取任务是不断循环的,每次栈被清空后,都会在消息队列中读取新的任务,如果没有新的任务,就会等待,直到有新的任务,这就叫事件循环。
posted @ 2020-04-29 10:33  KWskrrrr  阅读(143)  评论(0编辑  收藏  举报