1. JavaScript 应用场景
- Web 开发
- 原生 JavaScript
- React 开发
- Vue 开发
- 移动端开发
- ReactNative
- Weex
- 小程序端开发
- 微信小程序
- 支付宝小程序
- uniapp
- taro
- 桌面应用开发
- Electron (比如 VSCode)
- 后端开发
- Node 环境(比如 express、koa、egg.js)
2. JavaScript 核心知识点
2.1 面向对象
- JavaScript 面向对象、继承、 原型、原型链等
2.2 函数、闭包
- 闭包的访问规则
- 闭包的内存泄露
- 函数中 this 的指向
2.3 ES 新特性
- ES6、7、8、9、10、11、12 新特性
2.4 作用域
- 作用域的理解
- 作用域提升
- 块级作用域
- 作用域链
- AO、GO、VO 等概念
2.5 其他一系列知识
- 事件循环
- 微任务
- 宏任务
- 内存管理
- Promise
- await、 asnyc
- 防抖、节流等等
3. JavaScript 高级语言是怎么被执行的
3.1 语言被系统转换并执行
- 高级语言 -> 汇编语言 -> 机器语言
3.2 浏览器的工作原理
- 输入服务器地址
- 访问 index.html
- 下载 css + 下载 JavaScript
3.3 浏览器的内核
浏览器内核指的是浏览器排版引擎
- Gecko
- Trident
- Webkit
- Blink
3.4 浏览器渲染引擎
- 将 html 进行解析, 将其转换成 DOMTree
- 将 css 进行解析, 将其转换成 styleRules
- 将两者合并, 通过 layout 进行布局排版, 形成渲染树
- 通过浏览器
Painting
, 最终渲染到浏览器上
3.5 V8 引擎原理
- 解析(parse): 词法分生成 tokens和语法分析
- 形成抽象语法树(AST)
- 通过Ignition转换成字节码bytecode.
- TurboFan: 追踪热点函数标记为(hot), 记录对应的机器指令, 下次再执行代码时候,直接执行这个机器指令. 如果此时机器码受到操作设备问题, 那么通过Deoptimization将机器码转换成字节码, 再进行转换为汇编 -> 机器码.
3.6 v8 引擎架构
Blink
内核,加载 html, 下载 JavaScript 代码. 通过stream流方式
传递给 V8 引擎.- 通过Scanner 扫描器, 转化成 tokens. 将 tokens 给 Parser, Parser将其转换成AST 树.
- 再通过Ignition来将其转换成字节码, 最后转换成CPU 可以执行的指令
- 图上方的
PerParser
4. JavaScript 代码执行原理
- 从源代码 到 AST 这一步, V8 引擎内部会帮助我们创建一个对象(GlobalObject -> go) 并附带 window
- 运行代码:
- v8 为了执行代码,内部有个执行上下文栈(Execution Context Stack, EC Stack)(函数调用栈)
- 为了执行全局代码, V8 会创建
GO(Golbal Execution Context)
. 在 GO 中执行代码,又会有VO(Variable Object)
, 对于执行全局代码执行时,此时的VO===GO
. 从而再执行代码 - 如果执行代码时候,有函数则对函数单独生成
函数执行上下文(FEC) - Functional Execution Context
, 并在函数内部定义一个VO===AO
, 此时还会加一个作用域链
scope chain = VO + ParentScope, 也就是所谓的函数作用域.
4.1 环境变量
- VO
5. 垃圾回收
5.1 引用计数
- 当 a 被 b 引用, 那么 a 计数加一, a 再被 c 引用, 计数再加一. 手动将引用设置为 null, 则计数减一. 当计数为 0,则被清除
- 引用计数缺陷: 两个对象存在循环引用的问题, 那么这内存永远不会被释放.
5.2 标记清除
- 算法从设置一个根对象, 垃圾回收期会定期从这个根开始, 找所有从根开始有引用到的对象,对于哪些没有引用到的对象,就认为是不可用的对象.