您的位置:首页 > Web前端 > JavaScript

重温javascript--垃圾回收机制和块级作用域

2016-03-10 22:04 537 查看

垃圾回收机制

JavaScript有一种自动垃圾回收机制,也就是说执行环境会负责管理代码执行过程中使用的内存,在开发过程中就无需考虑内存分配及无用内存的回收问题了。JavaScript垃圾回收的机制很简单:找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是时时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行。

垃圾回收机制有两种方法:标记法和引用计数法(不常用)

标记法

标记法,这是最常用的垃圾回收方式。当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为“被使用”,当变量离开环境的时候(函数执行结束)将其标记为“未使用”。

这里又涉及到执行环境的问题。所谓的执行环境,就是定义了变量或函数有权力访问的其他数据,决定了它们各自的行为。

用代码来说明回收机制会更简洁一些。

//垃圾回收 标记法
function  test(){
var a=1;//被使用
var b=2;//被使用
}
test();//执行完毕以后,a和b又被标记为:未使用


如上,当函数执行完毕以后,a和b就会被再一次的标记为未使用,当然也有特殊情况(闭包)。闭包问题会单独拿出来温习。

引用计数法

引用计数法并不推荐使用,这个方法会带来内存泄露问题。这个方法是记录每个值被使用的次数,当声明了一个变量并将一个引用类型赋值给该变量的时候这个值的引用次数就加1,如果该变量的值变成了另外一个,则这个值得引用次数减1,当这个值的引用次数变为0的时候,说明没有变量在使用,这个值没法被访问了,因此可以将其占用的空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为0的值占用的空间。

代码如下:

function test(){
var a={};
var b={};
var c=a;
c=b;
}


这样a的引用次数为1,而b的引用次数都是2,即使在test()执行完成后,因为这两个对象的引用次数都不为0,所以其占用空间不会被清理,如果这个函数被多次调用,这样就会不断地有空间不会被回收,造成内存泄露。

垃圾回收机制这块内容也是参考了许多文章,转载的,原创的,如果有什么不对的地方,也请大牛们指出来。

块级作用域

javascript中是没有块级作用域这个概念的,所以一定要注意if和for的使用,如下代码

function test(){
for(var i=1;i<=3;i++){
alert(i);
}
alert(i);//此处的结果为4,为什么呢?
}
test();


当执行完以后,i又自加了。在高级语言中如java,if和for都有一个块级的作用域,当作用域执行完以后,内部的变量就直接被释放了。但是Js没有块级作用域,只有函数执行完毕以后,内部的变量才会被释放。

当然也可以使用自执行函数来模拟一个块级作用域的概念。

function test(){
(function(){
for(var i=1;i<=3;i++){
alert(i);
}
})()
alert(i);//此处就会报错了
}
test();


这就是模拟了高级语言中块级作用域的方法,很多基础的框架很多都用了这种方法。

如果有什么不对的地方,请指出,谢谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: