JavaScript变量作用域内存

87 阅读1分钟

背景

基础不牢地动山摇。

原始值与引用值

原始值:Undefined Null Boolean Number String Symobol BigInt

引用值:在内存中的对象,不能直接操作对象所在的内存空间,操作的是对该对象的引用。

  • 动态属性

  • 复制值

      引用类型复制指针
      值类型直接复制
    
  • 传递参数

      按照值传递参数
    
  • 确定类型

      typeof instanceof
    

执行上下文与作用域

每个上下文都有一个关联的变量对象,上下文中所有定义的所有变量和函数都存在于该对象上。上下文中的代码在执行时,会创建变量对象的一个作用域链,代码执行时的标识解析通过作用域链最前端开始逐级往后,如果无标识符,则报错。

  • 作用域链增强

  • 变量声明

      var let const(对象的键不受限制) 
      建议使用多const
    

垃圾回收

确定那个变量不会再使用,然后释放它占用的内存。

  • 标记清除

      标记内存中的所有变量=>去掉标记=>再次被标记的就是待删除的
    
  • 引用计数

      对每个值都记录被引用的次数=>引用数为0=>删除
      存在循环引用
    
  • 性能

      内存中的变量越多,性能损失越大
      
    
  • 内存管理

      使用let const声明提升性能
      隐藏类和删除操作
      内存泄露
      静态分配与对象池 如何减少浏览器进行垃圾回收的次数?
      vectorPool
      
      
    

小结

变量 作用域 内存是相关性较高的,理清关系写出性能更好的代码。