Javascript 当不再需要变量时,将其设置为null是否是一种良好的做法?

Javascript 当不再需要变量时,将其设置为null是否是一种良好的做法?,javascript,null,Javascript,Null,我看到javascript值在函数末尾设置为null。 这样做是为了减少内存使用还是仅仅为了防止意外使用 这样做是否有充分的理由。如果是,什么时候 var myValue; . . . myValue = null; 不,不是。每个局部变量在函数结束后都会被删除。在函数结束时将局部变量设置为null,不会有任何区别,因为它返回时会从堆栈中删除 但是,在闭包内部,变量不会被释放 var fn = function() { var local = 0; return functio

我看到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


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

涉及DOM元素的iE和循环引用出现问题。这通常是在附加侦听器时创建的,如下所示:

function doStuff() {
   var el = document.getElementById('someID');
   el.onclick = function() {
     // has closure to el
   };

   // remove reference to element
   el = null;
}
当调用doStuff ia时,附加到元素的匿名函数有一个返回到元素的闭包-一个循环引用。在旧版本的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节点。但是删除闭包中不需要的对象引用可能是一个好习惯。

是的,非常需要。 特别是当变量有一些秘密信息,如返回的密码时

一旦使用变量,就将其声明为null或“”,因为可以使用inspect元素读取js中的活动变量

var password = $('#password').val();
评估变量密码后,将其重置为“”。如果您不这样做,则可以通过选择任何现有html项目(如按钮)并使用inspect元素添加属性代码来访问该值

onclick = "javascript:alert(password);"
将变量password重置为null将确保密码信息的安全

var password = $('#password').val();
//do what you want to do with variable password
password = null;

因此,在函数末尾设置为null是redundent?除非变量不是使用“var”声明的@bob…并且变量不是函数的本地变量。可能存在一些与IE中引用DOM元素的变量相关的特定问题。从jQuery源代码获取,其中许多此类变量被设置为
null
。您考虑过闭包吗?是否有理由设置为null或使用delete来提高性能或优化内存usageThe在一些罕见的情况下,您可能希望将变量或对象属性设置为null,以允许GC释放内存(设置为null并不意味着将立即释放内存)。假设您有一个SPA,它主动使用缓存和一些html数据。保存缓存的变量可以从闭包中访问,闭包将在所有运行时都有效。也许在应用程序的某些状态下不再需要它,所以用null标记它。但我相信通常这种情况会发生,因为应用程序设计不好。在第二个例子中,你是否需要第二个
var
x
?你将如何执行'x=null;'如果你在那之前还了什么?你永远也达不到那一行代码。啊,是的,我的疏忽。我想知道为什么有人否决了我正确的答案。请在我错的地方留下一条评论。因为我们在这里讨论的是关于在问题中设置为null的一般性问题,也没有提到局部var或global@bob写了“在函数的末尾”,所以我假设这个问题是关于局部变量的。公认的答案几乎相同,但换言之。理解地阅读。哦,你现在也投了反对票吗?你可以在浏览器内置的调试器执行过程中随时看到js中任何变量的值。