基本概念
- 动态弱类型
- 与渲染互斥
- 面向对象与函数式
- 解释类
数据类型
- 对象
- 数组
- 函数
- 基础数据类型
- 字符串
- undefined
- 数字
- null
- symbol
- 布尔
作用域
静态作用域
- 通过它就能够预测代码在执行过程中如何查找标识符
- 变量提升
- var有变量提升
- let const 没有变量提升,提前访问会报错
- function函数可以先调用在定义
- 赋值给变量的函数无法提前调用
js 如何执行
源代码语法分析到AST,通过AST到字节码,字节码通过JIT到机器码执行
执行上下文
当JS引擎解析到可执行代码片段(通常是函数调用)的时候,就会先做一些执行前的准备工作,这个准备工作便是 执行上下文
- 全局执行上下文
- 代码开始执行时就会创建,将他压入执行栈的栈底,每个生命周期只有一份
- 函数执行上下文
- 当执行一个函数时,这个函数内代码的代码会被编译,生成变量环境,词法环境等,当函数执行结束的时候该执行环境从栈顶弹出
- Eval执行上下文
创建执行上下文
- 绑定This
- 创建词法环境
- 基于ECMA代码的词法嵌套结构来定义标识符和具体变量和函数的关联。一个词法环境由环境记录器和一个可能的引用外部词法环境的空值组成
- 创建变量环境
- 变量环境和词法环境的一个不同就是前者被用来存储函数声明和变量(let和const)绑定,后者只存储var
- Outer
- 指向外部变量环境的一个指针
闭包
this
- 普通函数的this指向window
- 对象调用指向对象
- 先赋值再调用,看调用的地方
- 创建临时对象
- 将this指向临时对象
- 执行构造函数
- 返回临时对象
垃圾回收
- 新生代
- 垃圾标记
- 对象复制
- 区域反转
- 老生代
事件循环
- 微任务
- 宏任务