记住一句话:一切都运行在内存里
开机
- 通电
- 读取固件
- 进入开机程序
- 在内存中运行操作系统
操作系统(会开启很多进程)
- 内核kernel
- 提供的操作界面叫shell
- kernel和shell交互
打开浏览器
- 双击chrome,运行chrome.exe文件
- chrome进程作为主进程
- 主进程会开启一些辅助进程,如网络服务、GPU加速
- 新建网页,可能会开启一个子进程
浏览器功能
- 发起请求
- 下载HTML、解析HTML
- 下载CSS、解析CSS
- 2.3.===渲染界面(HTML是节点,CSS是节点样式)
- 下载JS
- 解析(理解)并执行(产生效果)JS
- 4.===渲染引擎
- 6.===JS引擎
- 以上两个引擎处于不同的线程(比进程更小一级的工作单位)
- JS引擎要和渲染引擎通信用到【跨线程通信,为DOM】
- JS是单线程
- DOM操作慢
JS引擎
- chrome——V8引擎、C++
- 网景——Firefox、C++
- IE——chakra(Jscript9)
- edge——chakra(JavaScript)最新Microsoftedge——V8引擎
- node.js——V8引擎
功能
- 编译:翻译JS代码为机器可执行的字节码或机器码(二进制)
- 优化:改写代码,更高效
- 执行:执行、生效
- 垃圾回收:把JS用完的内存回收,再次使用
在执行JS代码之前,浏览器会提供API:window/document/setTimeout(都不是JS功能,以上功能称为运行环境runtime——env),一旦把JS放进页面里,就开始执行。
内存:被所有程序瓜分
截图来自饥人谷课件
数据区有stack、heap
- 用来存放数据
- 不存放变量
- stack:数据顺序存放(64位)
- heap:数据随机存放
截图来自饥人谷课件,看代码引用内存图就清晰很多了。
规律
- 数据分为:对象/非对象
- 非对象存在stack,除数字、字符串、布尔外,都是对象
- 对象存在heap,如数组、函数
- “=”总是会把右边的东西复制到左边
window
- console、document、对象、数组、函数都会挂在window
- 挂在window上的东西可以在任何地方直接用
- 对象(Object):var person = {}与var person = new Object()一样
- 数组(Array):var a = [1,2,3]与var a = new Array(1,2,3)一样
- 函数(Function):function f(){}与var f = new Function()一样
- window用内存图画出来
截图来自饥人谷课件
- 注意:window变量(内存地址)是个容器,用来存放window对象(一些数据)的地址
- 简单画法
截图来自饥人谷课件
- 打出Object结构:console.dir(window.object)
- 一般来说,名字第一个字母为大写的就会有prototype,如Object、Array
prototype
可以理解为是隐藏对象
截图来自饥人谷课件
- 如图就可以使得obj.toString === window.Object.prototype.toString 为true
- a.push === window.Array.prototype.push 为true
- prototype存储了xxx对象的共同属性,即原型(省代码、省内存)
- 每一个对象都有隐藏属性__proto__
- 我们只关心小写字母的隐藏属性,不关心首字母为大写的
prototype和__proto__区别
- 都存着原型的地址
- prototype挂在函数上(首字母大写)
- 而__proto__挂在新的对象上(小写)