JavaScript高级①-变量、作用域和内存
掌握基本类型和引用类型的值
- ECMAScript的数据类型包括两种:基本数据类型和引用数据类型。
- 基本数据类型指的是简单的数据段,常见的基本数据类型有: number, string, boolean, null, undefined。
- 引用数据类型指的是由多个值构成的对象,常见的引用数据类型(即:对象类型Object type)有: Object, Array, Function, Date等。
- 当我们对变量赋值时,解析器首先要确认的就是这个值是基本类型值,还是引用类型值。
- 两种数据类型的区别点如下:
- 声明变量时不同的内存分配。基本类型的值保存在栈内存中,引用类型的值同时保存在栈内存和堆内存中。
- 不同的内存分配机制也带来了不同的访问机制。
- 赋值变量时的不同。不能给基本类型的值添加属性。
- 参数传递的不同(把实参赋值给形参的过程)。
- 值的比较:
- 基本类型的比较是值的比较;
- 引用类型的比较是引用的比较;
执行环境及作用域
执行环境介绍
执行环境是JavaScript中最重要的一个概念。执行函数定义了变量或函数有权访问的其他数据,决定了他们各自的行为。每个执行环境都有一个与之关联的变量对象(variable object)和一个作用域链(scope chain),环境中定义的所有变量和函数都保存在其变量对象中。
执行环境分为两种,即:全局执行环境和函数执行环境
。全局执行环境
全局执行环境是最外围的一个执行环境,其变量对象就是全局活动对象(window activation object),全局执行环境直到应用程序退出(例如:关闭网页或浏览器)时才会被销毁。
函数执行环境
每个函数都有自己的执行环境。当执行流进入一个函数时,函数环境就会被推入一个环境栈中。当函数执行完之后,栈将该执行环境弹出,把控制权返回给之前的执行环境。函数执行环境的变量对象是该函数的活动对象(activation object)。
作用域链
对于每一个执行环境,都会创建一个与之关联的作用域链。每个执行环境的作用域链的前端,始终都是该执行环境的变量对象,对于全局执行环境就相当于window对象,对于函数执行环境就相当于该函数的活动对象;对于全局执行环境,已经是根部,没有后续;对于函数执行环境,其作用域链的后续就是该函数对象的[scope]属性里的作用域链。
垃圾收集
JavaScript具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使用的内存。
这种垃圾收集机制的原理其实很简单:找出那些不再继续使用的变量,然后释放其占用的内存。
标记清除:
JavaScript中最常用的垃圾收集方式是标记清除
。- 垃圾收集器会在运行的时候给存储在内存中的所有变量都加上标记,然后去掉环境中的变量以及被环境中的变量引用的变量的标记。
- 在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。
- 最后垃圾收集器完成内存清除的工作,销毁那些带标记的值并回收它们所占用的空间。
引用计数:
- 引用计数是不太常见的垃圾收集策略。
- 引用计数的含义是跟踪记录每个值被引用的次数。
- 当声明了一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数就是1,如果该值同时赋给另一个变量,则该值引用次数加1。相反,如果包含对这个值引用的变量又取了另一个值,则该值引用次数减1。
- 当这个值引用次数变成0时就说明没有办法再访问该值了,可将其占用的内存空间回收。
- 当垃圾收集器下次运行时,就会释放那些引用次数为0的值所占用的内存。
另外,垃圾收集处理方式除了以上两种策略,还可以进行垃圾周期处理
和解除引用
。
- 垃圾周期处理:找出那些不再继续使用的变量,然后释放其占用的内存,垃圾收集器会按照固定的时间间隔周期性地执行这一操作。
- 解除引用:对于全局变量,当不再使用时,使用null赋值是一个良好的习惯。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hoo's Blog!
评论