你好!
最近做扩展时遇到一个问题比较纠结,就是不清楚 closure 中的数据是否需要 delete?
将 closure 中变量置空能否提升性能?为了明了,写个简单例子说明,请高手指教!谢谢!function renderHtml( items ){
var parent = document.getElementById( 'container');
for ( var i = 0; i < items.length; i++) {
var a = document.createElement( 'a');
a.setAttribute( 'href', items[i].URL);
a.innerHTML = items[i].Title;
parent.appendChild( a); var img = document.createElement( 'img');
img.setAttribute( 'src', items[i].ImgURL);
parent.appendChild( img ); var btn = document.createElement( 'button');
btn.innerHTML = 'click';
parent.appendChild( btn);
btn.click = function(){ // 形成 closure
alert( 'hello world'):
// 假设这个句柄中不需要 items 中数据,并且 item 中有很多数据
// 请问是否需要 items = null 这样处理
}
}
}函数 renderHtml 用数组 items 生成 dom 放到页面中去,因为给生成的 dom 绑定事件形成了 闭包,假设这个 items 数据比较大,请问这种情况清空 items 会有性能提升么(比如在循环执行完后 items = null,之后 点击 btn 的 闭包中 items 就会是 null)?谢谢了。
最近做扩展时遇到一个问题比较纠结,就是不清楚 closure 中的数据是否需要 delete?
将 closure 中变量置空能否提升性能?为了明了,写个简单例子说明,请高手指教!谢谢!function renderHtml( items ){
var parent = document.getElementById( 'container');
for ( var i = 0; i < items.length; i++) {
var a = document.createElement( 'a');
a.setAttribute( 'href', items[i].URL);
a.innerHTML = items[i].Title;
parent.appendChild( a); var img = document.createElement( 'img');
img.setAttribute( 'src', items[i].ImgURL);
parent.appendChild( img ); var btn = document.createElement( 'button');
btn.innerHTML = 'click';
parent.appendChild( btn);
btn.click = function(){ // 形成 closure
alert( 'hello world'):
// 假设这个句柄中不需要 items 中数据,并且 item 中有很多数据
// 请问是否需要 items = null 这样处理
}
}
}函数 renderHtml 用数组 items 生成 dom 放到页面中去,因为给生成的 dom 绑定事件形成了 闭包,假设这个 items 数据比较大,请问这种情况清空 items 会有性能提升么(比如在循环执行完后 items = null,之后 点击 btn 的 闭包中 items 就会是 null)?谢谢了。
var i=0;
function b(){
alert(++i);
}
return b;
}
var c = a();
c();
c();第一次弹出0,第二次执行却弹出了1。
第一次c()后,a中的i依然保留.自然a在内存的栈区依然保留。
执行闭包后,闭包内部变量会存在,至于释放的话,你既然用闭包,就是想使用内部变量,释放做什么。
等一个作用域结束,js会自动释放的。
function renderHtml( items ){
var parent = document.getElementById( 'container');
for ( var i = 0; i < items.length; i++) {
var a = document.createElement( 'a');
a.setAttribute( 'href', items[i].URL);
a.innerHTML = items[i].Title;
//!!!!!!!!!!频繁的向dom中添加节点 会导致大量的reflow和repaint
parent.appendChild( a); var img = document.createElement( 'img');
img.setAttribute( 'src', items[i].ImgURL);
//!!!!!!!!!频繁的向dom中添加节点 会导致大量的reflow和repaint
parent.appendChild( img ); var btn = document.createElement( 'button');
btn.innerHTML = 'click';
parent.appendChild( btn); //!!!!!!!!!closure会造成循环引用导致ie下的内存泄露
btn.click = function(){ // 形成 closure
alert( 'hello world'):
// 假设这个句柄中不需要 items 中数据,并且 item 中有很多数据
// 请问是否需要 items = null 这样处理
}
}
}
items是引用行的
不管是不是闭包 只要还保留这对数组的引用
清空items都对没有用 在闭包引用的父函数的变量 当不在引用的时候会自动消失
可以查看下 垃圾回收机制
这个解释很合理啊.
另, 如果都使用的同一方法, 完全不需要像btn.click = function(){}这样创建函数. 直接btn.click = doClick; 然后doClick中写逻辑就行了. 这样只开辟一块内存空间
最后把btn设置成null
解释地址
http://blog.csdn.net/dead_of_winter/archive/2008/04/10/2277673.aspx