最近接受了一个Js职位的面试,问了不少Js的高级特性,才发现长时间使用已知的特性进行开发而忽略了对这门语言按部就班的理解,包括Java我想也是同样,偶尔在Sun官方看到JDK6.0列举出来的new features才发现不少东西是本身并不知道或者遗忘了的。看来仍是要坚持总结技术,反复理解和运用才能保持对任何技术的掌握运用能力阿。
翻了一些Js的新老资料,准备先讲讲Js的内存泄露问题——
当一个DOM对象包含一个Js对象的引用(例如一个Event Handler), 而这个Js对象又持有对这个DOM对象的引用时,一个环状引用就行成了。这自己并非什么错误或者Bug,由于Js的回收机制能理解这种环状的引用结构而且在没有其余对象能关联到环上的时候回收这个环上的全部对象内存。可不幸的是IE浏览器中的DOM结构并不受Js解释机制管理,因此它并不能理解这种失去外界引用的环状结构,致使环上任何对象都没法被访问到,但是内存依旧占据着,这也就是所谓的Js内存泄露了。
咱们来看一个经典的例子说明问题——程序员
(function(limit, delay){
var queue=new Array(10);
var n;
function makeSpan(n){
var s=document.createElement(‘span’);
document.body.appendChild(s);
var t=document.createTextNode(‘ ’+n);
s.appendChild(t);
s.onclick=function(e){
s.style.backgroundColor=’red’;
alert(n);
};
return s;
}
function process(n){
queue.push(makeSpan(n));
var s=queue.shift();
if(s)
s.parentNode.removeChild(s);
}
function loop()}{
if(n<limit){
process(n);
n+=1;
setTimeout(loop,delay);
}
}
loop();
})(10000,10);web
这个例子的意义是建立出10000个span元素来添加到DOM的body上,而且对其内容填充序号n,紧接着从queue的第一个位置移除建立的span元素,也就是说10000个为止,不断的建立再移除,永远只保留最新建立的那10个。这个例子知足的条件就是DOM元素带有Js对象即click事件的Event Handler,而Event Handler里面又带有这个DOM元素的引用,因而环状结构行程。