JavaScript单线程和多线程是很多小白同学入门的时候问到最多的问题,虽然官方给出过解释但对于新手来说并不友好,今天小千就来给大家介绍一下JavaScript的单线程。

一、 浏览器的进程和线程

浏览器的架构是多进程的,不同的浏览器采用不同的进程架构,这个没有统一的标准,以谷歌浏览器为例,他主要有四个进程,分别是顶层的Browser process,负责标签页网页呈现的Renderer Process,负责控制网页插件的Plugin Process和负责处理GPU的GPU Process。

每个进程都可以通过创建线程或者调用线程来完成任务。打个比方,进程就相当于一个 公司,线程就相当于公司的一个部门,一个公司可以只有一个部门也可以有多个部分,公司内部的资源是共享的。

二、浏览器的渲染进程

我们前端主要和Renderer Process打交道,在这个进程里面主要包含五个线程:

1、GUI渲染线程,用于解析html、css,构建DOM树和RenderObject树,布局和绘制等浏览器界面渲染任务|不能和JS引擎线程同时执行。

2、js引擎线程,也就是我们常说的js内核,用于解析、运行javascript代码,不能和GUI渲染线程同时执行。

3、事件触发线程,用于监听和触发事件,可以理解成由js引擎线程来执行事件绑定代码,然后另开事件触发线程用来监听事件的触发,触发以后把事件处理函数里面的代码交给js引擎线程来执行,但是js是单线程的,事件处理函数里面的代码会添加到待处理队列的末尾,也就是等js线程空闲以后才会执行。

4、定时触发器线程,就是经常使用的setInterval与setTimeout所使用的线程,可以理解成由js引擎线程来定义一个定时器,但是定时器的计数是另开单独线程来计时并触发定时,计时时间到了以后,把要执行的回调函数里面的代码添加到待处理队列的末尾,等待js线程空闲以后执行。

5、http请求线程,在我们使用XMLHttpRequest对象发送http请求的时候,是新开一个线程请求,检测到对象状态改变时,如果绑定了回调函数,异步线程就产生状态变更事件,将这个回调里面的代码添加到js线程末尾。

三、js引擎线程的单线程

1、分析下面代码执行过程,以定时器触发线程为例看不同线程和js线程的执行过程:

在上面代码中,js代码是由js引擎线程执行的,这里要明确,js是单线程的,同一时间只能执行一个的任务,所以有多个等待任务的时候需要排队,排在前面的先执行,排在后面的要等待前面任务完成才能执行。开始的t1时间里面,代码至上而下执行,当碰到setTimeout,这是个定时器,需要计时,把这个计时的任务交给定时触发器线程(时间到了以后把要执行的代码排队到t1的后面t2时间里面),继续执行js代码。

2、分析下面代码执行过程,观察js引擎线程和GUI线程的互斥:

在上面代码中,开始的t1时间里面,代码至上而下执行,当碰到事件绑定的时候,把这个事件监听的任务交给事件触发线程,继续执行js代码。当用户点击按钮,事件触发线程监听到事件,把事件处理函数里面的代码从队列末尾插入,在t2事件执行里面有三行代码第一行是box.innerHTML = “doing something”,这行代码是页面渲染,交给GUI渲染线程,由于GUI渲染线程和js引擎线程是互斥的,这个时候先让t2时间里面的其他js代码wait(3000);继续执行,把box.innerHTML = "doing something"插入t2的后面t3时间里面,执行完wait(3000)以后,最后一行是box.innerHTML = “finish”,这行代码也是页面渲染,交给GUI渲染线程,由于GUI渲染线程和js引擎线程是互斥的,不能同时执行,把box.innerHTML = "finish"从队列末尾插入,变成t4时间执行。所以,最后结果是,当用户点击的时候,div里面没有内容,3秒以后直接显示finish。

在前端学习过程中,js的单线程对大家理解同步和异步非常重要,熟悉js的单线程将让大家能够更好的理解事件,定时器和ajax请求的执行过程。

本文来自千锋教育,转载请注明出处。

前端开发技术-剖析JavaScript单线程相关推荐

  1. Web 前端开发技术 —— JavaScript

    Web 前端开发技术 -- JavaScript 总结 JavaScript 内容! 文章目录 Web 前端开发技术 -- JavaScript 一.js 的引用方式与执行顺序 1.引用方式 在标签中 ...

  2. 24HTML5期末大作业:XXX 网站设计——指环王:护戒使者(13页) HTML+CSS+JavaScript HTML+CSS+JS网页设计期末课程大作业 web前端开发技术 web课程 网页规

    HTML5期末大作业:XXX 网站设计--指环王:护戒使者(13页) HTML+CSS+JavaScript HTML+CSS+JS网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划 ...

  3. HTML5期末大作业:XXX 网站设计——指环王:护戒使者(13页) HTML+CSS+JavaScript HTML+CSS+JS网页设计期末课程大作业 web前端开发技术 web课程设计 网页规

    HTML5期末大作业:XXX 网站设计--指环王:护戒使者(13页) HTML+CSS+JavaScript HTML+CSS+JS网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划 ...

  4. HTML期末大作业—— 迪士尼影视电影(6页) HTML+CSS+JavaScript 网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计

    HTML5期末大作业:影视电影网站设计-- 迪士尼影视电影(6页) HTML+CSS+JavaScript 网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计 文章目录 HTM ...

  5. HTML5期末大作业:影视电影网站设计—— 迪士尼影视电影(6页) HTML+CSS+JavaScript 网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计

    HTML5期末大作业:影视电影网站设计-- 迪士尼影视电影(6页) HTML+CSS+JavaScript 网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计 常见网页设计作业 ...

  6. 《Web前端开发技术(HTML+CSS+JavaScript)》题库附答案

    什么是Web技术? 答:Web即全球广域网(World Wide Web),也称为万维网,它是一种基于超文本和HTTP的.全球性的.动态交互的.跨平台的分布式图形信息系统.它是建立在Internet上 ...

  7. Web前端开发大系概览 (前端开发技术栈)

    前言 互联网建立50多年了,网站开发技术日新月异,但web前端始终离不开浏览器,最终还是HTML+JavaScript+CSS这3个核心,围绕这3个核心而开发出来大量技术框架/解决方案. 我从2000 ...

  8. Web前端开发技术栈(前端干货)

    Web前端开发技术栈 浏览器 Internet Explorer(需要了解,需不需要看公司业务需求) Chrome(建议学习使用) Firefox(建议学习使用) Safari(建议学习使用) Ope ...

  9. 《Web前端开发技术》笔记

    参考文献--<Web前端开发技术> by 储久良 目录 第1章 Web前端开发技术综述 1.1 Web概述 1.1.1 Web的起源 1.1.2 Web的特点 1.1.3 Web工作原理 ...

最新文章

  1. web中session与序列化的问题
  2. android o miui特性,终于来了,小米开启 Android O 内测
  3. 神经网络-全连接层(1)
  4. 操作系统:了解一下磁盘结构
  5. 关于Operation 的那些事
  6. 编译原理习题(含答案)——4-7语法分析——MOOC哈尔滨工业大学陈鄞配套_学习通_慕课堂
  7. 人人都能够做深度学习应用:入门篇
  8. python自动化办公教程-python办公自动化:Excel操作入门
  9. 【C++程序设计语言A视频教程 全12讲 中科院】【下载链接】
  10. 魔兽争霸显示无法登录服务器,魔兽登陆不上去_网络一切正常,但是魔兽世界就是登不上去...
  11. 国内航线图 或城市之间连接图
  12. npm install报错10054,Error while executing
  13. java中复数的类型_java构造一个复数类
  14. Android正方教务系统课程表+查成绩+查考试安排
  15. Hadoophbase监控页面未授权访问漏洞处理方案验证过程实现
  16. 阿里内推五面:一面+二面+三面+交叉面+HR面,含答案赠送
  17. 为什么我选择csdn写blog
  18. Windows编程实现俄罗斯方块
  19. 电驴大全为什么下载不了的原因,以及其他下载资源的网站
  20. openid和unionid的区别

热门文章

  1. Linux系统安装python3和创建python3虚拟环境
  2. springboot数据访问基本操作步骤
  3. django mysql connector_MySQL Connector / Python作为Django引擎?
  4. 前端设定项目奖金有多少_华为资深HR:年终奖不是一个合理的奖金制度
  5. wxpython开发的软件_Python GUI开发环境的搭建(wxPython)
  6. SpringMVC的数据响应方式
  7. Struts2封装获取表单数据方式
  8. MySQL和PGSQL事务锁等待超时时间
  9. TensorFlow 2——【module ‘tensorflow.compat.v1‘ has no attribute ‘contrib‘】解决方案
  10. JAVA——操场跑步路径定位模拟解决方案