浏览器中的js执行机制
今天在网上看到讨论浏览器的工作原理,我发现学习前端这么久了,竟然没有系统的学习过浏览器,知道的都是些零零散散的东西,于是趁现在空余时间,赶紧瞅瞅。
单线程的含义
什么是线程?什么是进程?
进程包含多个线程,进程是操作系统最小的执行单位。
浏览器是一个多进程(multi-process),一个浏览器只有一个主进程(Browser Process)负责管理Tabs(窗口),协调Renderer Process 和其他Process
渲染进程(Renderer Process)是一个多线程的 它的主线程负责渲染页面和执行js以及事件循环 渲染进程的主线程是一个单线程(同一时间js执行线程和ui渲染线程只有一个在主线程上)
同步、异步
正是因为js是单线程的,很多的任务只能一个一个排队执行这对用户体验不好,所以就将任务分成了同步任务和异步任务。
简单的理解:
-
同步:获取元素、console.log()、alert、定义 变量…
-
异步: 事件、定时器、延时器 …
- 判断任务是同步还是异步
- 同步任务直接在主线程执行、异步任务进入事件表并等待一个条件(时间,或者用户操作:例如 点击)。
- 注册回调函数 异步任务进入事件队列
- 当主线程空闲时(同步执行完成),事件队列中的任务才被推入主线程执行。
完了吗?事情并非如此
console.log('1');
setTimeout(function() {
console.log('第一个setTimeout');
process.nextTick(function() {
console.log('3');
})
<