JS变量存储(栈和堆)


JS变量存储(栈和堆)

1.JS 是 动态语言(运行过程中检查数据类型) 弱类型语言(支持隐式转换)

静态语言:声明的时候就需要确认其变量类型 C语言
弱类型语言:支持变量类型隐式转换 C语言

2.7种数据类型为 原始类型: Null Undefined Boolean Number String BigInt Symbol

Object 引用类型

  1. JS执行过程中,存在三类空间, 代码空间 栈空间 堆空间

  2. 原始类型保存在栈中,引用类型保存在堆中

原始类型完整复制变量值,引用类型赋值是复制引用地址
区分堆和栈是因为 减小栈空间大小,栈空间过大将影响上下文切换效率
函数执行完时,只需指针下移到上个执行上下文的地址,栈空间不会设置太大,堆空间很大,能存放大数据

闭包储存在堆中

  1. JS引擎 执行到 外部函数x 时, 先编译,创建空执行上下文
  2. JS引擎 编译过程中 发现 内部函数1 引用了 外部函数的 a变量,判定产生了闭包,
  3. JS引擎 在 堆空间 创建一个 ‘closure(x)’对象,保存了 a变量(无论是否是引用类型)
  4. JS引擎 编译过程中又发现 内部函数2 引用了 外部函数的 b变量,
  5. JS引擎 将 变量b 也保存在 ‘closure(x)’对象 中
  6. 外部函数x 的 变量c 没有被引用,依旧保存在 执行上下文栈 的 变量环境 或 词法环境中

执行到外部函数的时候, 内部函数的闭包就已经产生了
闭包机制依赖了两步, 1. 预扫描内部函数, 2. 内部函数引用的外部变量保存在堆中


文章作者: 罗紫宇
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 罗紫宇 !
  目录