操作系统常识
一切都运行在内存里
开机
按开机键——主板通电——读取固件——加载开机程序——将文件里的操作系统加载到内存运行
操作系统(以Linux为例)
- 加载内核——启动初始化进程——启动系统服务(文件、安全、联网)——等待用户登录——登录后运行 shell
- bash 是一种 shell ,图形化界面也可以认为是一种 shell
浏览器
开启浏览器进程作为主进程,它会开启一些辅助进程,如网络服务,GPU加速,每新建一个网页,都有可能开启一个子进程。
浏览器的功能
发起请求,下载 HTML,解析 HTML,下载 CSS,解析 CSS,渲染界面,下载 JS,解析 JS,执行 JS等,JS 想要去修改 HTML 或者 CSS 需要线程通信,这就叫跨线程通信,也是 DOM 操作慢的原因。
功能模块:用户界面、渲染引擎、JS 引擎、存储等,功能模块一般都处于不同线程。
线程:是操作系统能够进行运算调度的最小单位,JS 就是单线程的。
上面功能模块一般各处于不同的线程(比进程更小一级的东西)
理解:例如百度打开一个知乎网页,知乎网页这个页面上运行渲染引擎和JS引擎,知乎已经是一个进程了,而这两个引擎在知乎页面内运行,成为线程。
每一个页面都会开启一个渲染线程和JS线程。
问:JS是怎么渲染的?
答:线程通信,JS要修改HTML或者CSS,不能直接修改,要通过线程之间的通信来通知渲染引擎,这叫做跨线程通信。(谷歌会提供通信接口)
[
](https://blog.csdn.net/sinat_38021004/article/details/118267853)
JS 引擎
主要功能
编译:把 JS 代码翻译为机器能执行的字节码或机器码 优化:改写代码,使其更高效 执行:执行上面的字节码或机器码 垃圾回收:把 JS 用完的内存回收,方便之后再次使用
执行 JS 代码
准备工作
提供API: window / document / setTimeout
这些功能是浏览器提供的,不是 JS 自身具备的功能
这些功能被称为运行环境 ( runtime environment )
JS 代码会在内存中运行
深入研究
- JS代码在哪里运行?
答:内存。一个HTML引用了JS,下载后代码放到内存里。 - 代码放到哪个内存里?
答:下方内存图解释
内存图
- 红色区域存放数据,变量名在不知什么区,每种浏览器的分配规则并不一样
- 红色区域分为 Stack 栈 和 Heap 堆
- Stack 区的特点是每种数据顺序存放
- Heap 区的特点是每种数据随机存放
数据分为两种:非对象和对象(只有数字、字符串、布尔不是对象)
- 非对象存在 Stack 区
- 对象存在 Heap 区
- = 号总是会把右边的东西复制到左边(不存在传值和传址)
以下举例window内存图
- 总结该图:
- window有三个属性,第一个属性指向console;第二个属性Object指向了一个函数,函数有两个属性;Array指向了一个对象,对象也有两个属性(一般第一个字母大写就会有prototype)
- object是个函数,可以创造一个新的对象,console.dir(window.object),其中dir的意思是打出它的结构,可以显示一个对象所有的属性和方法
- window 对象和 window 变量是两个东西
- 变量在不知什么区,对象在 Heap 区
- 变量是个容器,存放对象的地址
- 对象只是 Heap 里的数据
JS原型
- 一般来说,首字母大写就会有 prototype 属性
- xxx.prototype 存储了 xxx 对象的共同属性,这就是原型
- 原型的好处:无需重复申明共有属性,可以省代码,省内存
- 每个对象都有一个隐藏属性 也就是指定原型(对象)
prototype 和 —proto— 的区别
- 都存着原型的地址
- 只是 prototype 挂在函数上
- —proto— 挂在每个新生成的对象上