在Javascript中对同一个变量没有`删除`的`new`

Mat*_*haq 12 javascript garbage-collection object new-operator

这样做可以吗?:

function mygetTime()
{
    var d = new Date();
    return(d.getTime());
}

function wasteSomeMemory()
{
    var temp;
    for(var count = 0; count < 1000000; count += 1)
    {
        temp = mygetTime();
    }
}
Run Code Online (Sandbox Code Playgroud)

调用wasteSomeMemory()会导致内存泄漏吗?

那这个呢:

function wasteSomeMemory2()
{
    var temp;
    for(var count = 0; count < 1000000; count += 1)
    {
        temp = new Date();
    }
}
Run Code Online (Sandbox Code Playgroud)

调用wasteSomeMemory2()会导致内存泄漏吗?我应该delete temp;在for循环结束时使用吗?

function wasteSomeMemory2()
{
    var temp;
    for(var count = 0; count < 1000000; count += 1)
    {
        temp = new Date();
        delete temp;
    }
}
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 32

new并且delete在JavaScript中没有任何关系(尽管它们与其他语言中完全不同的结构有着令人困惑的相似性).不要担心创建objects(new)而不显式清理它们,这就是垃圾收集器的工作.

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

正确使用的例子delete:

var obj = {};
obj.foo = "bar"; // Now `obj` has a property called `foo`
delete obj.foo;  // Now it doesn't
Run Code Online (Sandbox Code Playgroud)

你的getmyTime功能非常好.该Date对象将成为资格函数返回时立即收回(无论回收是完全下降到实现).除了有缺陷的实现之外,它不会导致内存泄漏.

您的wasteSomeMemory2同样不会导致内存泄漏,实际上您无法调用delete temp; - 您只能删除属性,而不能删除变量.


这里当你有帮助垃圾收集器了几次,但那些通常不会(在我的经验)有对象属性做,因此不涉及delete.当你创建函数实例时,它们才会真正出现(如果你正在设置事件处理程序或计时器函数等,这通常很常见).例如,考虑:

function foo() {
    var listOfThings = /* ...get a list of things... */;

    // ...do something with `listOfThings`...

    setInterval(function() {
       // ...do something that *doesn't* need `listOfThings`...
    }, 1000);
}
Run Code Online (Sandbox Code Playgroud)

因为您分配给定时器的匿名函数setInterval将在函数调用后继续存在,所以它会保留对函数调用期间范围内所有内容的实时引用(无论是否使用它).这样可以保留listOfThings指向内存的内容列表.如果计时器功能不需要该列表,那么这是一个问题.listOfThings如果你知道函数不需要它,你可以通过分配undefined或者当你完成它时的null任何内容来释放指向的列表listOfThings:

function foo() {

    var listOfThings = /* ...get a list of things... */;

    // ...do something with `listOfThings`...

    listOfThings = undefined; // Done with it           <== The new bit

    setInterval(function() {
       // ...do something that *doesn't* need `listOfThings`...
    }, 1000);
}
Run Code Online (Sandbox Code Playgroud)

对于事件处理函数等也是如此.无论何时创建函数,它都会"关闭"(保持实时引用)范围内定义的任何内容.因此,如果您不需要这些东西,您可以通过清除它们的引用来确保它们不会留在内存中.(更多:闭包并不复杂)


Ray*_*nos 5

最简洁的答案是不。

长答案是我们希望上帝能浏览垃圾收集器捡到这个。