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