在不再需要变量时将变量设置为null是一种好习惯吗?

时间:2011-08-25 11:47:02

标签: javascript null

我在功能结束时看到javascript值设置为null。 这样做是为了减少内存使用量还是仅仅防止意外使用在其他地方?

这样做是否有好的理由。如果是的话?

var myValue;
.
.
.
myValue = null;

4 个答案:

答案 0 :(得分:19)

在函数结束时将局部变量设置为null没有任何区别,因为无论如何它都将从堆栈中删除。

但是,在闭包内部,变量将被释放。

var fn = function() {

   var local = 0;

   return function() {
      console.log(++local);
   }

}

var returned = fn();

returned(); // 1
returned(); // 2

jsFiddle

当返回内部函数时,外部变量的作用域将继续存在,可以被返回的内部函数访问。

答案 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;