操作系统常识
一切都在内存里
- 主板通电,读取固件,开机,操作系统加载到内存中运行
打开浏览器
chrome.exe
-
双击Chrome图标,就会运行Chrome.exe
-
开启Chrome进程,作为主进程
-
主进程会开启一些辅助进程,如网络服务,GPU进程
-
每新建一个网页,就有可能会开启一个子进程
浏览器的功能
-
发起请求,下载HTML,解析HTML,下载CSS,解析CSS,渲染页面,下载JS,解析JS,执行JS等。
-
功能模块:用户页面,渲染页面,JS引擎,存储等。
-
上面功能模块一般各处于不同的线程(比进程更小)。
-
如果进程是车间,那么线程就是车间里的流水线。
-
注意:渲染页面:把HTML和CSS放在屏幕上叫做引擎。解析的意思是理解,读取它的意思。执行是让它产生效果。
-
注意: 一个页面会开一个渲染线程和一个JS线程,JS是单线程的。若JS引擎想要修改渲染引擎,则需要跨线程通信。(DOM操作慢)
JS引擎
现在JS引擎暂时默认是V8引擎,其他不讨论
主要功能
-
编译:把JS代码翻译为机器能执行的字节码或机器码
-
优化:改写代码,使其更高效
-
执行:执行上面的字节码或者机器码
-
垃圾回收:把JS用完的内存回收,方便之后再次使用
执行JS代码
准备工作
-
提供API:window / document / setTimeout
-
上面这些东西都不是JS自身具备的功能
-
我们将这些功能称为运行环境 runtime env
-
一旦把JS放进页面,就开始执行JS
JS代码在哪里运行?
- 内存
内存图
瓜分内存
红色区域
作用
-
红色专门用来存放数据,我们目前只研究该区域
-
红色区域并不存变量名,变量名在[不知道什么区]
-
每种浏览器的分配规则并不一样
-
上图的区域并不完整,还有[调用栈],[任务队列]等区域没有画
Stack和Heap
-
红色区域分为 Stack栈 和 Heap堆
-
Stack区特点:每个数据顺序存放
-
Heap区特点:每个数据随机存放
规律
-
数据分两种:非对象和对象
-
非对象都存在Stack区(数字,字符串,布尔都是非对象)
-
对象都存在Heap区(数组,函数都是对象)
-
= 号总是会把右边的东西复制到左边(不存在什么传值和传地址)
window浏览器
还要有什么
要有console
- 于是就有了console,并且挂到window上
要有document
- 于是就有了document,并且挂到window上
要有对象
- 于是就有了Object,并且挂到window上
var person = {} 等价于 var person = new Object()
要有数组(一种特殊的对象)
- 于是就有了Array,并且挂到window上
var a = [1,2,3] 等价于 var a = new Array(1,2,3)
要有函数(一种特殊的对象)
- 于是就有了Funtion,并且挂到window上
function f(){} 等价于 var f = new Funtion()
- 注意:后者是正规写法,但是没有人用;前者是不正规写法,但是好用。
为什么都挂在window上
- 因为方便,挂在window上的东西可以在任何地方直接用
window的内存图
-
如何知道函数的数据结构? 答:console.dir(window.Object)
-
注意:如何第一个字母大写(Object,Array,Funtion),就有prototype属性
细节
原型链
-
原型让你无需重复声明共有属性:省代码,省内存
-
每个对象都有一个隐藏属性:指向原型(对象),这个隐藏属性叫做__ proto__。
-
prototype和__proto__区别是什么
-
都存着原型的地址,只不过prototype挂在函数上,__ proto__挂在每个新生成的对象上。