垃圾回收机制、arguments

111 阅读2分钟
垃圾的缺点
    创建变量或对象时,解释器都必须分配内存来存储那个实体。只要像这样动态地分配了内存,最终都要释放这些内存
以便他们能够被再用,否则,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

//arguments对象是function的一个属性,包含了实参的相关内容
function test(x,y){
    alert("形参个数为; "+test.length);//函数名.length形参个数
    alert("实参个数为: "+arguments.length); // arguments.length 实参个数
    if(test.length!=arguments.length){
        alert("参数个数不正确");
    }
}
test( 1,2,4);

伪数组也称类数组像arguments或者获取一组元素返回的集合都是伪数组。