我曾经看到过在函数末尾将 JavaScript 值设置为 null
的情况。这是为了 减少内存使用 还是为了 防止其他地方意外使用?
这样做是否有好处?如果有,那么什么情况下需要这样做?
var myValue;
.
.
.
myValue = null;
我曾经看到过在函数末尾将 JavaScript 值设置为 null
的情况。这是为了 减少内存使用 还是为了 防止其他地方意外使用?
这样做是否有好处?如果有,那么什么情况下需要这样做?
var myValue;
.
.
.
myValue = null;
在函数的结尾处将本地变量设置为null
并不会产生任何影响,因为它在返回时就会从堆栈中移除。
然而,在闭包内部,该变量将不会被释放。
var fn = function() {
var local = 0;
return function() {
console.log(++local);
}
}
var returned = fn();
returned(); // 1
returned(); // 2
当内部函数被返回时,外部变量的作用域将继续存在,并可以被返回的内部函数访问。
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.onclick
后将el设置为null(或除el之外的任何内容),以断开循环引用。
使用它的第二个原因类似-如果函数具有保留对可能被垃圾回收的大对象的引用的闭包,则删除引用可能很有用,以便可以清理该对象:
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节点,否则通常不会出现此类问题。但最好养成在不需要时从闭包中删除对象引用的习惯。
x
的 var
吗? - alex不,它并不是。每个本地变量在函数结束后都会被删除。
非常是的。
特别是当变量包含一些秘密信息,例如返回的密码时。
一旦使用变量,请将其声明为null或"",因为js中的活动变量可以通过检查元素来读取。
var password = $('#password').val();
在评估变量密码后,将其重置为“”。如果您不这样做,则可以通过选择任何现有的HTML项(例如按钮)并使用检查元素来添加属性代码来访问该值。
onclick = "javascript:alert(password);"
var password = $('#password').val();
//do what you want to do with variable password
password = null;