我在功能结束时看到javascript值设置为null
。
这样做是为了减少内存使用量还是仅仅防止意外使用在其他地方?
这样做是否有好的理由。如果是的话?
var myValue;
.
.
.
myValue = null;
答案 0 :(得分:19)
在函数结束时将局部变量设置为null
没有任何区别,因为无论如何它都将从堆栈中删除。
但是,在闭包内部,变量将不被释放。
var fn = function() {
var local = 0;
return function() {
console.log(++local);
}
}
var returned = fn();
returned(); // 1
returned(); // 2
当返回内部函数时,外部变量的作用域将继续存在,可以被返回的内部函数访问。
答案 1 :(得分:18)
iE和涉及DOM元素的循环引用存在问题。这通常在附加侦听器时创建,如下所示:
function doStuff() {
var el = document.getElementById('someID');
el.onclick = function() {
// has closure to el
};
// remove reference to element
el = null;
}
当调用 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
}
}());
因此,如果返回 someFunction 的函数实际上不需要引用 reallyBigObject ,那么可以删除引用,因此闭包不会阻止它成为垃圾不必要地收集。
请注意,您无法阻止对范围内变量的闭包,但您可以修改它们的值。
除非你长时间打开页面并进行大量的AJAX并添加和删除大量DOM节点,否则这些东西通常不是什么大问题。但是,在不需要它们的闭包中删除对象的引用可能是个好习惯。
答案 2 :(得分:3)
不,不是。在函数结束后删除每个局部变量。
答案 3 :(得分:-1)
是非常的。 特别是如果变量有一些秘密信息,例如返回的密码。
一旦你使用变量声明它为null或""因为js中的活动变量可以使用inspect元素读取。
var password = $('#password').val();
评估变量密码后,将其重置为""。如果不这样做,可以通过选择任何现有的html项(如按钮)并使用inspect元素添加属性代码来访问该值
onclick = "javascript:alert(password);"
将变量密码重置为null将确保您的密码信息安全。
var password = $('#password').val();
//do what you want to do with variable password
password = null;