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

bob*_*bob 36 javascript null

我已经看到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)

jsFiddle.

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


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节点,否则这些东西通常不是什么大问题.但是,在不需要它们的闭包中删除对象的引用可能是个好习惯.