js变量,作用域与内存问题(垃圾回收机制)

js变量,作用域与内存问题(垃圾回收机制)

  • JavaScript变量可以用来保存两种类型的值: 基本类型值和引用类型值。基本类型的值源自一下5中基本数据类型:Undefined, Null, Boolean, Number, String。引用类型值指的是那些由多个值构成的对象(Object, Array, Date, RegExp, Function, 基本包装类型, 单体内置对象)。基本类型值和引用类型值具有以下特点:
    • 基本类型值在内存中占据固定大小的空间,因此被保持在栈内存中
    • 从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本
    • 引用类型的值是对象,保存在堆内存中
    • 从一个变量向另一个变量复制引用类型的值,复制的其实是个指针,因此两个变量最终都指向同一个对象(各个语言这块都大同小异)
    • 确定一个值是哪种基本类型可以使用 typeof 操作符, 而确定一个值是那种引用类型可以使用 instanceof 操作符
  • 所有变量(包括基本类型和引用类型类型)都存在于一个执行环境(也成为作用域)中,这个执行环境决定了变量的生命周期,以及哪一部分代码可以访问其中的变量。以下是关于执行环境的几点总结:
    • 执行环境有全局执行环境与函数执行环境
    • 每次进入一个新环境,都会创建一个用于搜索变量和函数的作用域链
    • 函数的局部环境不仅可以访问当前函数作用域中的变量, 而且有权访问其父环境(向上访问),那只全局函数
    • 全局环境只能访问在全局环境中定义的变量和函数, 而不能’直接’(with)访问局部环境中的任何变量
    • 变量的执行环境有助于确定应该何时释放内存
  • JavaScript是一门具有自动垃圾收集机制的编程语言,开发人员不必关心内存分配和回收问题。以下是JavaScript的垃圾收集例程:
  • js垃圾收集机制的原理: 找出那些不再继续使用的变量, 然后是放弃占用的内存。为此,垃圾收集器会按照固定时间间隔(或者代码执行中预定的收集时间),周期性的执行这一操作

  • 具体的两种方法
    • 标记清除
      1. 垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记(任何标记方式都ok)
      2. 去掉环境中的变量和被环境中变量引用的变量的标记
      3. 垃圾收集器完成内存清除工作, 销毁他们的值并回收它们所占用的内存空间
    • 引用计数

      引用计数实际上就是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数就是 1。如果同一个值又被赋给了另一个变量,则该值的引用次数加 1。相反,如果包含这个值引用的变量又取得了另外一个值,则这个值的引用次数减 1, 当这个值的引用次数变成 0 时,则说明没有办法再访问这个值了,因而就可以将其占用的内存空间回收回来。这样,当垃圾收集器再次运行时,它就会释放那些引用次数为 0 的值所占用的内存

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值