什么是异步
js是单线程语言,因为它是运行在浏览器的渲染主线程上,而浏览器的渲染主线程只有一个,但是渲染主线程需要渲染页面执行js代码等等,
如果用同步的话就有可能造成渲染主线程的阻塞,就会导致消息队列里面的其他任务不能及时执行,一方面会导致主线程会有等待的时间,另一方面会导致页面没有及时更新
所以就采用异步的方式来避免,具体方法是当某些任务执行时,比如计算器、网络请求、事件监听,主线程会把对应的任务交给对应的线程去执行(计算器交由计时线程)然后再去执行主线程上面的代码 当其他线程完成时会将对应的回调函数包装成任务放到消息队列的末尾等待主线程的执行
js的事件循环
事件循环又叫消息循环或者消息队列,是浏览器渲染主线程的的工作方式。
会开启一个不会结束的for循环,每次循环时就从消息队列取出一个第一个任务执行,其他线程只需要在合适的时候往消息队列末尾添加任务。
以前会把消息队列分为宏任务和微任务,但是现在已经满足不了了,每个任务都有不同的类型,同类型的任务必须在同一个队列,不同的任务可以分属于不同的队列,但是队列里面不能一会这个一会那个类型的任务 在一次循环中,由浏览器决定执行哪一个队列的任务,浏览器必须有一个微队列(优先级最高)交互队列(高)延时队列(中)
js中计算器能不能精确计时
1、操作系统的计时函数本身就有少量偏差,js的计时器最终也是调用操作系统的函数
2、按照w3c的标准,浏览器实现计时器时,如果嵌套超过五层就会带有4毫秒的延时
3、受时间循环的影响,计算器的回调函数只能在渲染主线程空闲的时候运行,因此会带来偏差