Javascript中复制变量值,删除引用,释放内存机制

4.1.2 复制变量值
Boolean、Number、String、Undefined、Null
复制基本类型的值时,会在栈中创建一个新值,然后把该值复制到为新变量分配的位置上;
两个值相互独立,参与任何操作均不会相互影响。

Object(Array,Function);
复制引用类型的值时,同样也会将存储在栈中的值复制一份放到为新变量分配的空间中,不同的是,这个值的副本实际上是一个指针,
指针指向存储在堆中的一个对象,两个变量实际上将引用同一个对象,因此改变其中一个变量,就会影响另一个变量;


5.5 Function类型
疑惑:
function sum(num1,num2){
return num1 + num2;
}

alert(sum(10,10)); //20

var anotherSum = sum;
alert(another(10,10)); //20

sum = null;
alert(anotherSum(10,10)); //20

4.3.3 管理内存
确保占用最少的内存可以让页面获得更好的性能,而优化没存占用的最佳方式,就是为执行中的代码只保存必要的数据,
一旦数据不再有用,最好通过将其值设置为null来释放其引用,这种做法叫删除引用,适用于大多数全局变量和全局对象的属性。

在上边 anotherSum 是 sum 的复制,两个变量指向同一对象,已经设置了sum = null 删除引用,为什么没有释放内存空间?anotherSum依然可以执行?
莫非是删除引用并没有清空对象? 那设置null有何意义?

在Java中找到的关于对引用类型释放内存解释:
Java把内存分成两种,一种叫做栈内存,一种叫做堆内存

在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,
java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。

堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。
在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,
在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,
引用变量相当于为数组或者对象起的一个别名,或者代号。

引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。
而数组&对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,
数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。
这个也是java比较占内存的主要原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!


重点:数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。

Javascript中 当我们给引用值设置为null时,只是删除了引用,并不能直接释放内存,内存是在之后自动释放;
而上例中,我们删除了sum的引用,单依然有anotherSum 指针指向该对象,所以anotherSum 函数依然可以执行。

posted @ 2013-04-25 10:38  花落红尘  阅读(2023)  评论(0编辑  收藏  举报