美文网首页
关于js的变量,作用域以及内存问题 (基础第四篇)

关于js的变量,作用域以及内存问题 (基础第四篇)

作者: 山大王_af2b | 来源:发表于2018-05-29 16:58 被阅读0次

4.1基本数据类型和引用数据类型

基本数据类型包括:Number String Boolean Null Undefined (ES6 Symbol)

引用数据类型:Object

4.1.1动态属性 

但是不能给基本数据类型值添加属性,只能给引用类型之添加属性。

4.1.2复制变量

复制基本类型值:这两个变量可以参与任何操作而不会相互影响

复制引用类型值:当一个变量复制另一个变量的引用类型值时,同样也会将存储在变量对象中的值复制放到为新变量分配的空间,不同的是,这个值得副本是个指针,而这个指针指向堆中的一个对象,两个变量实际引用同一个对象。

4.1.3传递参数

参数是按值传递的:(参数类似于局部变量)

4.1.4检测数据类型

基本数据类型检测typeof

引用类型检测instanceof

result = variable instanceof constructor;

4.2执行环境及作用域

在web浏览器中,全局执行环境被认为是windows对象。因此所有全局变量和函数都是作为windows对象的属性和方法创建的。当该环境被销毁,保存在其中的变量和函数也会销毁。

当代码在一个环境中执行时,会创建变量对象的一个作用域链,作用域链就是保证所有变量和函数的有序访问。最开始只包含一个变量,就是arguments对象(这个对象在全局环境中不存在),下一个变量对象来自包含(外部)环境,全局执行环境的变量对象始终都是作用域链中的最后一个对象。

4.2.1延长作用域链

with

try-catch语句中的catch

这里with将 location对象的所有属性和方法,添加到作用域链的顶端。这样就可以在bulidUrl的作用域中返回url;

4.2.2没有块级作用域

Js没有块级作用域,在其他类C的语言中,由花括号封闭的代码都有自己的作用域,因而支持根据条件来定义变量。

1. 声明变量var

使用var声明的变量会自动添加到最接近的环境中。如果初始化变量时没有使用var声明,这个变量就会自动被添加到全局环境。

2. 查询标识符

4.3垃圾回收机制

4.3.1标记清除

垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记。然后,它会去掉环境中变量以及环境中的变量引用的变量的标记,而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后垃圾收集器完成内存清除工作。销毁那些带标记的值并回收他们所占用的空间。

4.3.2引用计数

跟踪记录每个值被引用的次数。

当声明一个变量并将一个引用类型值赋值给这个变量时,则这个值得引用次数是1.如果同一个值又被赋值给这个变量时,则该值的引用次数加1.相反,如果包含对这个值引用的变量又取得另外一个值,则引用次数减一。当这个值的引用次数变成0,则说明没有办法在访问这个值,因此可以将其占用的内存空间回收起来。

BOM和DOM使用的就是这种。

一般将他们设置为null就可手动释放内存。

循环引用导致无法回收。

这种做法适用于大多数全局变量和全局对象的属性。

相关文章

网友评论

      本文标题:关于js的变量,作用域以及内存问题 (基础第四篇)

      本文链接:https://www.haomeiwen.com/subject/aoyajftx.html