持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
打开一个网页浏览器使用的功能
- 发起请求,下载HTML,解析HTML,下载CSS,解析CSS,渲染界面,下载JS,解析JS,执行JS等。
- 功能模块:用户界面、渲染引擎、JS引擎、存储等。(功能模块一般处于不同的线程)
//一般情况下,解析HTML与下载CSS可以同时进行,但HTML下载与JS解析分情况,若JS改变其样式则不能同时给进行。
JS一般是单线程的,如果JS需要使用渲染,则JS引擎与渲染引擎进行跨线程通讯。
JS引擎
JS引擎举例:
- Chrome用的是V8引擎,C++编写。
- 网景使用的是SpiderMonkey,后来被Firefox使用,C++。
- Safari用的是JavascriptCore。
- IE使用的是Chakra(JScript9)
- Edge使用的是Chakra(JavaScript),最新版本使用的是V8引擎。
- Node.js使用的是V8引擎。
主要功能:
- 编译:把JS代码翻译为机器能执行的字节码或者机器码。
- 优化:改写代码,使其更高效。
- 执行:执行上面的字节码或者机器码。
- 垃圾回收:把JS用完的内存回收,方便之后再次使用。
内存使用
内存被各程序瓜分,操作系统占据一部分,Chrome占据一部分,辅助进程和各页面占据一部分,其中每个页面有渲染线程,用户界面,JS引擎。
JS引擎将JS代码放入代码区,将代码中变量放置一个区域内,然后将之放入栈和堆中。上图并不完整。
Stack区特点:每个数据顺序存放。
Heap区特点:每个数据随机存放。
规律:数据分两种,对象和非对象。
- 非对象都存在stack。
- 对象都存在Heap。
Window
console.dir(window.Object) 可以打印出Object的结构
window变量在内存中占用:
另一种画法:
关于Window:
- window变量和window对象是两个东西
- window变量是一个容器,存放window对象的地址
- window是Heap中的数据
同理:
- console和console对象也不是一个东西,一个是属性存放地址,一个是对象存放数据。
原型链
var obj = {}
obj.toString()
为什么可以不报错?
- obj有一个隐藏属性
- 隐藏属性存储了Object.prototype对象的地址
- obj.toString()发现obj上没有toSting,于是就进入隐藏属性对应的对象内寻找,找到了Object.prototype里的toString。
原型可以让使用者不用声明,就可以调用其共有属性。
隐藏属性指向共有属性,共有属性就是原型。
prototype与__proto__的区别
都存着原型的地址,只不过prototype挂在函数上,__ proto __ 挂在每个新生成的对象上。