为了方便开发者不去关心内存分配的事情,javascript 在变量申明的时候就已经顺便分配了内存。java
var n = 123; // 给一个number分配内存 var s = "azerty"; // 给一个string分配内存 var o = { a: 1, b: null }; // 给一个object分配内存 var a = [1, null, "abra"]; // (和object同样)给一个array及里面的值分配内存 function f(a){ return a + 2; } // 给一个function分配内存(function也能够看成一个object) // 函数的表达式一样也是至关于给一个object分配内存 someElement.addEventListener('click', function(){ someElement.style.backgroundColor = 'blue'; }, false);
var d = new Date(); var e = document.createElement('div');// 给一个dom元素分配内存
var s = "azerty"; var s2 = s.substr(0, 3); // s2 是一个新的string // 因为strings是一些不可变的值组成的,javascript可能不会给其分配内存,而只是存储一个[0,3]的范围 var a = ["ouais ouais", "nan nan"]; var a2 = ["generation", "nan nan"]; var a3 = a.concat(a2); // 新的array,包含四个元素,分别由a和a2的元素组成
var o = { a: { b:2 } }; // 建立了两个对象,一个引用了另一个对象做为其属性 显然,都不能够被回收 var o2 = o; // o2 也引用了 o o = 1; // 如今,o中原始的对象有一个惟一的引用 o2的变量中 var oa = o2.a; // 引用o2的a属性 // 这个对象产生了两个引用,一个是o2的a对象,另外一个一个是oa变量 o2 = "yo"; // 原始的o对象如今是0引用 // o能够被回收 // 然而其属性a仍然被oa引用了,所以其内存不能被释放 oa = null; // 原始对象o中的a是0引用了 // 此时能够被回收
function f(){ var o = {}; var o2 = {}; o.a = o2; // o 引用了 o2 o2.a = o; // o2 引用了 o return "azerty"; } f();
var div = document.createElement("div"); div.onclick = function(){ doSomething(); }; // div 经过 事件引用了其onclick属性 // handler一样引用了div // 循环引用,内存泄露