垃圾的缺点
创建变量或对象时,解释器都必须分配内存来存储那个实体。只要像这样动态地分配了内存,最终都要释放这些内存
以便他们能够被再用,否则,JavaScript的解释器将会消耗完系统中所有可用的内存,造成系统崩溃。
js分配内存的操作有: new、{}、[]、 function(){}
js的回收
JavaScript的解释器可以检测到何时程序不再使用一个对象了,当他确定了一个对象是无用的时候,他就知道不再
需要这个对象,可以把它所占用的内存释放掉了
垃圾回收的方法:
现在各大浏览器通常用采用的垃圾回收有两种方法:标记清除、引用计数
标记清除:当变量进入执行环境是,就标记这个变量为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所
占用的内存,因为只要执行流进入相应的环境,就可能会用到他们。当变量离开环境时,则将其标记为“离开环境”。
引用计数:引用计数的含义是跟踪记录每个值被引用的次数。
减少js的垃圾回收:
1、对象object优化
减少new: new关键字就意味着一次内存分配.减少new和{}使用
{"foo” :" bar”}这种方式新建的带属性的对象,常常作为方法的返回值来使用,可是这将会导致过多的内存创建
2数组array优化
将[]赋值给一个数组对象,是清空数组的捷径(例如: arr = ;),将数组长度赋值为0(arr.length = 0)也能达到
清空数组的目的,并且同时能实现数组重用,减少内存垃圾的产生。
3、方法function优化(闭包)
方法本身自动销毁,但是动态创建的方法会产生垃圾,将作为返回值的方法保存起来
面向对象使用为了封装
4、利用迭代代替原有方法
arguments
function test(x,y){
alert("形参个数为; "+test.length);
alert("实参个数为: "+arguments.length);
if(test.length!=arguments.length){
alert("参数个数不正确");
}
}
test( 1,2,4);
伪数组也称类数组像arguments或者获取一组元素返回的集合都是伪数组。