内存图与JS世界(具体的)

107 阅读3分钟

记住一句话:一切都运行在内存里

开机

  1. 通电
  2. 读取固件
  3. 进入开机程序
  4. 在内存中运行操作系统

操作系统(会开启很多进程)

  • 内核kernel
  • 提供的操作界面叫shell
  • kernel和shell交互

打开浏览器

  1. 双击chrome,运行chrome.exe文件
  2. chrome进程作为主进程
  3. 主进程会开启一些辅助进程,如网络服务、GPU加速
  4. 新建网页,可能会开启一个子进程

浏览器功能

  1. 发起请求
  2. 下载HTML、解析HTML
  3. 下载CSS、解析CSS
  4. 2.3.===渲染界面(HTML是节点,CSS是节点样式)
  5. 下载JS
  6. 解析(理解)并执行(产生效果)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引擎

功能

  1. 编译:翻译JS代码为机器可执行的字节码或机器码(二进制)
  2. 优化:改写代码,更高效
  3. 执行:执行、生效
  4. 垃圾回收:把JS用完的内存回收,再次使用

在执行JS代码之前,浏览器会提供API:window/document/setTimeout(都不是JS功能,以上功能称为运行环境runtime——env),一旦把JS放进页面里,就开始执行。

内存:被所有程序瓜分

微信图片_20220815232036.png截图来自饥人谷课件

数据区有stack、heap

  1. 用来存放数据
  2. 不存放变量
  3. stack:数据顺序存放(64位)
  4. heap:数据随机存放

微信图片_20220815232427.png截图来自饥人谷课件,看代码引用内存图就清晰很多了。

规律

  • 数据分为:对象/非对象
  • 非对象存在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用内存图画出来 微信图片_20220816224537.png截图来自饥人谷课件
  • 注意:window变量(内存地址)是个容器,用来存放window对象(一些数据)的地址
  • 简单画法 image.png截图来自饥人谷课件
  • 打出Object结构:console.dir(window.object)
  • 一般来说,名字第一个字母为大写的就会有prototype,如Object、Array

prototype

可以理解为是隐藏对象 image.png截图来自饥人谷课件

  • 如图就可以使得obj.toString === window.Object.prototype.toString 为true
  • a.push === window.Array.prototype.push 为true
  1. prototype存储了xxx对象的共同属性,即原型(省代码、省内存)
  2. 每一个对象都有隐藏属性__proto__
  3. 我们只关心小写字母的隐藏属性,不关心首字母为大写的

prototype和__proto__区别

  1. 都存着原型的地址
  2. prototype挂在函数上(首字母大写)
  3. 而__proto__挂在新的对象上(小写)

对象篡改

微信图片_20220818233525.jpg