浅析 JavaScript 执行过程

126 阅读3分钟

进程与线程

  1. 进程:是计算机中的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的基本单元
  2. 多进程:启动多个进程,多个进程可以一块来执行多个任务
  3. 单线程:进程内一个相对独立的,可调度的执行单元,于同属的一个进程共享着进程中的资源(同一时间,只能做一件事)
  4. 多线程:启动一个进程,在一个进程内部启动多个线程,这样,多个线程也可以一块执行多个任务(也是通过调度来做的,如同多进程 能做多任务一样,多线程也能做多任务)

进程 好比与一个工厂,内存资源共享;线程 好比工人,同时间内只能处理一件事

浏览器是多进程的

  • brower进程:浏览器的主进程,负责协调资源与主管其他进程,有且只有一个

  • 负责浏览器界面显示,与用户交互。如前进,后退等

  • 负责各个页面的管理,创建和销毁其他进程

  • 将渲染(Renderer)进程得到的内存中的Bitmap(位图),绘制到用户界面上

  • 网络资源的管理,下载等

  • 第三方插件进程:管理浏览器中的插件功能与调用

  • GPU进程:负责 3D 绘制的,不负责 一般的界面渲染

  • 浏览器渲染引擎进程(浏览器内核)

浏览器渲染引擎

该进程为多线程的,主要包括6个线程

  1. js引擎线程:负责解析运行 Js 代码脚本,与 GUI线程 互斥。一个Tab页中同一时间内保持单线程,避免产生 DOM冲突

  2. GUI线程:负责渲染浏览器界面,解析 HTML、CSS 后产生 DOM树、CSS树、Render树,处理页面布局以及绘制

  3. 异步http网络请求线程:处理网络请求与响应

  4. 定时器触发线程:处理setTimeout 与 setInterval 回调

  5. 浏览器事件触发线程:例如鼠标点击、悬浮等内置事件的监听、注册、触发

  6. 合成线程:将 GUI线程结果进行位图换算

单线程的缺点

同一事件只能处理一件事,当数据量过大时,计算能力有限

解决方案: 

  1. SSR(交由服务端数据处理、反馈一个静态页面)

  2. webWorker(纯粹计算,无法访问DOM)

执行过程

实例代码解析

同步代码按顺序从上往下执行

// 同步代码按顺序从上往下执行
function test () {    debugger;
    var test1 = function () {
        console.log(2); 
    }
    
    test1();
    console.log(1);
}
test();
// 2 1

优先执行同步代码,异步代码进入任务队列(其中分为 宏任务 和 微任务)

  • 宏任务每次弹出一条最先执行完成的进入主线程

  • 微任务会在每次主线程完成后,清空整个微队列线程

    // HTML5 中规定的最小延迟4msconsole.log(1) setTimeout(function () { console.log(2); }) console.log(3);

HTML5中规定了 setTimeout 最小执行事件为 4ms,人眼的最佳反应时间一般设置为 30ms

setTimeout(function () {
    console.log(1);
}, 1000)
setTimeout(function () {
    console.log(2);
})
console.log(3);