NotionNext
NotionNext
编程爱好者
/互联网从业者
/知识分享博主
认知决定态度,态度决定选择,选择决定人生

JS 内存图与世界

发布于:2022-1-4|最后更新: 2023-8-29|
type
status
date
slug
summary
tags
category
icon
password

JS 运行

一切都运行在内存里

开机
  • 操作系统在 C 盘里
  • 当你按下开机键,主板通电,开始读取固件
  • 固件就是固定在主板上的存储设备,里面有开机程序
  • 开机程序会将文件里的操作系统加载到内存中运行
操作系统(以 Linux 为例)
  • 首先加载操作系统的内核
  • 然后启动初始化进程, 编号为 1, 每个进程都有编号
  • 启动系统服务: 文件, 安全, 联网
  • 等待用户登录: 输入密码登录/ssh 登录
  • 登录后, 运行 shell, 用户就可以和操作系统对话了
  • bash 是一种 shell, 图形化界面可以认为是一种 shell

打开浏览器

chrome.exe
  • 你双击 Chrome 图标,就会运行 chrome.exe 文件
  • 开启 Chrome 进程,作为主进程
  • 主进程会开启一些辅助进程,如网络服务,GPU 加速
  • 你每新建一个网页,就有可能开启一个子进程
浏览器的功能
  • 发起请求, 下载 HTML , 解析 HTML, 下载 CSS,解析 CSS, 渲染界面, 下载 JS, 解析 JS,执行 JS 等
  • 功能模块: 用户界面, 渲染引擎,JS 引擎, 存储等
  • 上面功能模块一般处于不同的线程(比进程更小)
  • 如果进程是车间,那么线程就是车间里的流水线
  • JS 是单线程的,一个页面只能开一个渲染引擎和 JS 引擎
  • 如果 JS 引擎需要去修改 HTML 或者 CSS,他不能直接修改,他要通过线程之间的通信通知渲染引擎 ,这个操作叫做跨线程通信。
  • 由于跨线程通信肯定比线程内慢一点,所以这就是为什么 DOM 操作慢

JS 引擎

JS 引擎举例

  • Chrome 用的是 V8 引擎,C++编写
  • 网景用的是 SpiderMonkey, 后被 Firefox 使用,C++
  • Safari 用的是 JavaScriptCore
  • IE 用的是 Chakra(JScript9)
  • Edge 用的是 Chakra(JavaScript)
  • Node.js 用的是 V8 引擎

主要功能

  • 编译: 把 JS 代码翻译为机器能执行的字节码或机器码
  • 优化:改写代码,使其更高效
  • 执行:执行上面的字节码或者机器码
  • 垃圾回收: 把 JS 用完的内存回收,方便之后再次使用

执行 JS 代码

准备工作
  • 提供 API:window/document/setTimeout
  • 上面这些东西都不是 JS 自身具备的功能
  • 我们将这些功能称为运行环境 runtime env
  • 一旦把 JS 放进页面,就开始执行 JS
  • JS 代码在哪里运行?
  • 答:内存

内存图

瓜分内存

红色区域
作用
  • 红色区域专门用来存放数据
  • 红色区域并不存变量,变量在绿色区域
  • 每种浏览器的分配规则并不一样
  • 上图的区域并不完整
Stack 和 heap
  • 红色区域分为 Stack 栈和 Heap 堆
  • Stack 区特点:每个数据顺序存放
  • Heap 区特点:每个数据随机存放

Stack 和 Heap 举例

代码
规律
  • 数据分两种: 非对象和对象
  • 非对象都存在 Stack
  • 对象都存在 Heap
  • =号总是会把右边的东西复制到左边(不存在什么传值和传址)
对象被篡改

JS 世界

JS 开天辟地

神说要有光,就有了光;
JS 开发者说要有 window,就有了 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)
要有函数(一种特殊的对象)
  • 于是就有了 Function, 并且挂到 window 上
  • function f(){}等价于 var f =new Function()
怎么什么都挂在 window 上?
答:因为方便,挂在 window 上的东西可以在任何地方直接用
如何知道 window.object 的结构?
答:console.dir(window.object) ,打出它的结构

window 内存图

notion image
有更简单的画法
notion image
什么情况下有 prototype?
答:一般来说,对象名首字母是大写的有 prototype 属性

关于 window

  • window 变量和 window 对象是两个东西
  • window 变量是一个容器,存放 window 对象的地址
  • window 对象是 Heap 里的一坨数据
  • 不信的话,可以让 var x=window, 那么这个 x 就指向了 window 对象,window 变量可以去死了
同理
  • console 和 coosole 对象不是同一个东西
  • Object 和 Object 函数对象不是同一个东西
  • 前者是内存地址,后者是内存
 
 
学 JavaScript 需要什么JS 语法