从chrome的进程说起
当你双击chrome快捷方式打开chrome,计算机就多了一个chrome的进程,chrome进程,会分多个子进程,包括:
- 扩展应用程序子进程,
- GPU子进程
- new Tab的子进程
- ...
在new Tab的子进程中会有多个线程,线程是比进程更轻量级的一个概念,包括:
- 渲染引擎
- JS引擎
- 用户界面
- 存储
我们可以了解到,JavaScript其实是单线程执行的,那我们怎么进行DOM操作呢,只能进行跨线程通信,让JS引擎通知,渲染引擎,元素的改变,所以业界常说的,DOM操作慢,就是因为DOM操作需要跨进程。
可以看图:

浏览器的功能(面试常考)
- 发起请求,下载HTML,解析HTML,下载CSS,解析CSS,渲染界面,下载JS,解析JS,执行JS
- 功能模块:用户界面,渲染引擎,JS引擎,存储
- 功能模块一般处于不同的线程
JS引擎
各大浏览器用的JS引擎
chrome用的V8引擎,c++编写
网景用的是SpiderMonkey,后被Firefox使用,c++编写
Safari用的是JavaScriptCore
IE用的是Chakra(JScript9)
Edeg用的是Chakra(JavaScript)
JS引擎的功能
- 编译:把JS代码翻译为机器能执行的字节码或机器码
- 优化:优化字节码和机器码
- 执行:执行上面的字节码和机器码
- 垃圾回收:把JS内存用完再回收
JS为我们准备了什么环境?
提供了API:window/document/setTimeout,这些都是JS只身具备的功能,我们称这些功能称为运行环境(runtime env)
那么我们的JS代码放在哪了?
JS代码放到了内存了里面

unknowed 区存放变量
Stack区特点:每个数据顺序存放
Heap区的特点:每个数据随机存放
var a=1;
var b=a;
var person={name:'zhangsan',child:{name:'jack'}};
var person2=person;
问下面代码是如何存放的

这就可以解释为什么
person2.name="gebilaowang"
person.name会变成"gebilaowang"
JS世界是怎么样的
window浏览器提供
console
document
Object
Array(一种特殊的对象)
Fucntion(一种特殊是对象)
全部挂在Windonw上
挂在window上都可以直接使用

把Window在内存图中表示

原型
什么是原型?
保存了它的地址,即引用/指向
对象的一个特殊属性
它使得所有的实例对象,都共享有它的属性
可以解释为什么
var obj={}
obj.toSting()
obj明明为空,并且没有任何属性
但它却能调用toString属性,原因是obj种有一个隐藏属性,它的名字是__proto__,里面有toString方法

