var num = 10; var str = "hello"; var flag = true; var obj = new Object(); var arr = ["a","b","c"]; var person = new Person(100,"zyb",25) function Person(id,name,age){ this.id = id; this.name = name; this.age = age }
以上代码在内存中的位置分析图,如下栈中的obj指向堆中的Object,person指向第三部分,array指向第二部分javascript
内存 | |||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
如下是分配内存空间的几种状况:java
原理上一块内存不须要了,就会被释放掉,可是怎么肯定一块内存不须要?一个对象不被引用就会被释放,一个对象被引用一次,引用计数就加1;算法
var outerObj = {//外层对象 innerObj:{//内层对象 msg:"hello" } } //内层对象被外层对象引用,外层对象被outerObj引用 //内层对象引用计数:1 //外层对象引用计数:1 //内层对象和外层对象不会被垃圾回收 var tempObj = outerObj //内层对象引用计数:1 //外层对象引用计数:2 //内层对象和外层对象不会被垃圾回收 var outerObj = 1 //内层对象引用计数:1 //外层对象引用计数:1 //内层对象和外层对象不会被垃圾回收 var _tempObj = tempObj.innerObj //内层对象引用计数:2 //外层对象引用计数:1 //内层对象和外层对象不会被垃圾回收 var tempObj = 2 //内层对象引用计数:1 //外层对象引用计数:0 //内层对象不会被垃圾回收 //外层对象会被垃圾回收 var _tempObj = 3 //内层对象引用计数:0 //外层对象引用计数:0 //内层对象会被垃圾回收 //外层对象会被垃圾回收
function f(){ var o = {}; var o2 = {}; o.a = o2; // o 引用 o2 o2.a = o; // o2 引用 o return “ok”; } f();
分析:函数
上面f函数执行完后,里面的变量按理来讲都会被释放,可是o和o2互相调用,两者的引用计数都不为0,所以两者都不会被收回,从而致使内存泄漏this
当一个对象不可达的时候,这个对象就会被释放,上面o和o2不被任何对象引用,即处于“不可达”状态,能够被回收prototype
function box(num){ //按值传递 num+=10; return num; } var num = 10; var result = box(num); console.log(result); //20 console.log(num); //10
var name ="zhangsan"; function setName(){ name = "lisi" } setName(); console.log(name)//lisi
var name ="zhangsan"; function setName(name){ console.log(name)//lisi } setName("lisi"); console.log(name)//zhangsan