JS变量存储(栈和堆)
1.JS 是 动态语言(运行过程中检查数据类型) 弱类型语言(支持隐式转换)
静态语言:声明的时候就需要确认其变量类型 C语言
弱类型语言:支持变量类型隐式转换 C语言
2.7种数据类型为 原始类型: Null Undefined Boolean Number String BigInt Symbol
Object 引用类型
JS执行过程中,存在三类空间, 代码空间 栈空间 堆空间
原始类型保存在栈中,引用类型保存在堆中
原始类型完整复制变量值,引用类型赋值是复制引用地址
区分堆和栈是因为 减小栈空间大小,栈空间过大将影响上下文切换效率
函数执行完时,只需指针下移到上个执行上下文的地址,栈空间不会设置太大,堆空间很大,能存放大数据
闭包储存在堆中
- JS引擎 执行到 外部函数x 时, 先编译,创建空执行上下文
- JS引擎 编译过程中 发现 内部函数1 引用了 外部函数的 a变量,判定产生了闭包,
- JS引擎 在 堆空间 创建一个 ‘closure(x)’对象,保存了 a变量(无论是否是引用类型)
- JS引擎 编译过程中又发现 内部函数2 引用了 外部函数的 b变量,
- JS引擎 将 变量b 也保存在 ‘closure(x)’对象 中
- 外部函数x 的 变量c 没有被引用,依旧保存在 执行上下文栈 的 变量环境 或 词法环境中
执行到外部函数的时候, 内部函数的闭包就已经产生了
闭包机制依赖了两步, 1. 预扫描内部函数, 2. 内部函数引用的外部变量保存在堆中