Javascript中的同一个变量上没有`delete`的`new`

前端之家收集整理的这篇文章主要介绍了Javascript中的同一个变量上没有`delete`的`new`前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这样做可以吗?
  1. function mygetTime()
  2. {
  3. var d = new Date();
  4. return(d.getTime());
  5. }
  6.  
  7. function wasteSomeMemory()
  8. {
  9. var temp;
  10. for(var count = 0; count < 1000000; count += 1)
  11. {
  12. temp = mygetTime();
  13. }
  14. }

调用wasteSomeMemory()造成内存泄漏?

那这个呢:

  1. function wasteSomeMemory2()
  2. {
  3. var temp;
  4. for(var count = 0; count < 1000000; count += 1)
  5. {
  6. temp = new Date();
  7. }
  8. }

调用wasteSomeMemory2()造成内存泄漏?我应该使用delete temp吗在for循环结束?

  1. function wasteSomeMemory2()
  2. {
  3. var temp;
  4. for(var count = 0; count < 1000000; count += 1)
  5. {
  6. temp = new Date();
  7. delete temp;
  8. }
  9. }

解决方法

新的和删除在JavaScript中没有任何关系(尽管它们与其他语言中完全不同的结构混淆).不要担心创建对象(新的)而没有明确地清理它们,那就是垃圾收集器的工作.

new是通过构造函数创建对象.另一方面,删除用于从对象中删除属性.除了作为副作用(例如,如果唯一未被提到的对象的引用来自您删除属性),它与从内存中删除对象无关.

正确使用删除的示例:

  1. var obj = {};
  2. obj.foo = "bar"; // Now `obj` has a property called `foo`
  3. delete obj.foo; // Now it doesn't

你的getmyTime函数是完美的. Date对象在函数返回后(将被回收完全归结为实现)将有资格立即回收.它不会导致内存泄漏,除了有bug的实现.

你的wasteSomeMemory2同样不会造成内存泄漏,实际上你不能调用delete temp; – 你只能删除属性,而不是vars.

有时你必须帮助垃圾收集器,但通常不会(在我的经验中)与对象属性有关,所以不涉及删除.当你创建函数实例(这是很经常的,如果你正在设置事件处理程序或定时器函数等),他们才真正出现.例如,考虑:

  1. function foo() {
  2. var listOfThings = /* ...get a list of things... */;
  3.  
  4. // ...do something with `listOfThings`...
  5.  
  6. setInterval(function() {
  7. // ...do something that *doesn't* need `listOfThings`...
  8. },1000);
  9. }

因为您通过setInterval分配给定时器的匿名函数将能够在函数调用中生效,因此在该函数调用期间(无论是否使用它)都保留对范围内所有内容的实时引用.这将列出listOfThings在内存中指向的内容.如果定时器功能不需要该列表,那就是一个问题.如果您知道该函数不需要它,可以通过在完成以下操作时分配undefined或null或者将其中的任何内容分配给listOfThings,即可释放listOfThings指向的列表:

  1. function foo() {
  2.  
  3. var listOfThings = /* ...get a list of things... */;
  4.  
  5. // ...do something with `listOfThings`...
  6.  
  7. listOfThings = undefined; // Done with it <== The new bit
  8.  
  9. setInterval(function() {
  10. // ...do something that *doesn't* need `listOfThings`...
  11. },1000);
  12. }

事件处理函数等也是一样的.每当创建一个函数时,它都会在定义的范围内“关闭”(保留一个实时引用).所以如果你不需要这些东西,你可以通过清除对它们的引用来确保它们不被记忆. (更多:Closures are not complicated)

猜你在找的JavaScript相关文章