1.关于线程问题:
-
JS
是单线程的,使用H5
中的Web Worker可以多线程执行 -
浏览器是多线程执行的。浏览器是多进程:chrome ,单进程:firefox
2.浏览器内核:
支撑浏览器最核心的程序
不同浏览器可能不一样
内核由很多模块组成:
3.主线程和分线程
主线程:
js
引擎模块,负责js
程序的编译于运行html
,css
文档解析模块:负责页面文本的解析。将文本解析为一个个的节点。DOM
/CSS
模块:负责dom
/css
在内存中的相关处理,最终将所有的节点都解析为一个个对象,根据相互之间的某种关系存储在内存中。- 布局和渲染模块:负责页面的布局和效果的绘制(内存中的对象)
分线程:
- 定时器模块:负责定时器的管理
- 事件响应模块:负责事件的管理
- 网络请求模块:负责
ajax
请求
4.定时器是如何执行的?
定时器并不能保证真正定时执行,一般会延迟一丁点(可以接受),也可能延迟很长时间(不能接受)。
setTimeout()
的回调函数是在主线程执行的,定时器回调函数只有在运行栈中全部代码执行完后才有可能执行。
5.为什么js
要用单线程模式,而不用多线程模式?
作为浏览器的脚本语言,javaScript
的主要作用是与用户交互,以及操作DOM。这就定了他只能是单线程,否则会带来很复杂的同步问题。
举个例子:如果有一个Dom对象,此时有两个线程对该对象分别要进行更新和删除操作,如果这时其中一个线程对对象进行了删除操作,然后紧接着线程切换到下一个,这时另一个线程对该对象要进行更新操作,显然是无法完成的。我们知道在java
中常用多线程,可是这里的多线程是争对多个用户对象的,也就是说一个线程服务一个对象,所以这样就不会造成混乱。当然js
中也可以实现多线程,但是这必须得保证,不能使多个线程对同一个对象进行操作。
6.代码的分类:
-
初始化代码(同步代码):包含绑定
dom
事件监听,设置定时器,发送ajax
请求的代码2.回调代码(异步代码):处理回调逻辑。 -
js
执行引擎行代码的基本流程:先执行初始化代码===>回调代码 -
.模型的2个重要组成部分:
-
事件(定时器/DOM事件)管理模块。这些管理模块都是在分线程的。前面我们说
js
不是单线程的吗?怎么又来个分线程,切记:这里的分线程不是由js引擎所执行的,而是由浏览器执行的。 -
回调队列。这个队列是上面的分线程执行任务完毕之后然后将回调函数放入了回调队列。
-