我已经看到null
在函数末尾设置了javascript值.这样做是为了减少内存使用还是为了防止在其他地方意外使用?
这样做有好的理由吗?如果是这样的话?
var myValue;
.
.
.
myValue = null;
Run Code Online (Sandbox Code Playgroud)
ale*_*lex 20
将一个局部变量设置null
在函数末尾没有任何区别,因为无论如何它都将从堆栈中删除.
但是,在闭包内部,变量不会被释放.
var fn = function() {
var local = 0;
return function() {
console.log(++local);
}
}
var returned = fn();
returned(); // 1
returned(); // 2
Run Code Online (Sandbox Code Playgroud)
返回内部函数时,外部变量的作用域将继续存在,可以被返回的内部函数访问.
Rob*_*obG 19
iE和涉及DOM元素的循环引用存在问题.这通常在附加侦听器时创建,如下所示:
function doStuff() {
var el = document.getElementById('someID');
el.onclick = function() {
// has closure to el
};
// remove reference to element
el = null;
}
Run Code Online (Sandbox Code Playgroud)
当调用doStuff时,附加到元素的匿名函数有一个闭包到元素 - 一个循环引用.在IE的旧版本中,这会导致内存泄漏,因此解决方案是将el设置为null(或除el之外的任何内容)以在分配后中断循环引用el.onclick
.
使用它的第二个原因是类似的 - 如果一个函数有一个闭包,它将一个大对象保存在一个可能被垃圾收集的大对象上,那么删除该引用以便清理该对象可能很有用:
var someFunction = (function() {
var x = reallyBigObject;
// do stuff that uses reallyBigObject
// Remove reference to reallyBigObject if it's no longer required
x = null;
return function() {
// closure to x is unavoidable, but reference to reallyBigObject isn't required
}
}());
Run Code Online (Sandbox Code Playgroud)
因此,如果返回到someFunction的函数实际上不需要引用reallyBigObject,则可以删除引用,因此闭包不会阻止它被不必要地进行垃圾回收.
请注意,您无法阻止对范围中的变量进行闭包,但您可以修改它们的值.
除非你长时间打开页面并进行大量的AJAX并添加和删除大量DOM节点,否则这些东西通常不是什么大问题.但是,在不需要它们的闭包中删除对象的引用可能是个好习惯.
归档时间: |
|
查看次数: |
67273 次 |
最近记录: |