gpt4 book ai didi

javascript - `new` 没有 `delete` 在 Javascript 中的相同变量

转载 作者:可可西里 更新时间:2023-11-01 01:56:10 26 4
gpt4 key购买 nike

这样做可以吗?:

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

function wasteSomeMemory()
{
var temp;
for(var count = 0; count < 1000000; count += 1)
{
temp = mygetTime();
}
}

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

这个怎么样:

function wasteSomeMemory2()
{
var temp;
for(var count = 0; count < 1000000; count += 1)
{
temp = new Date();
}
}

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

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

最佳答案

newdelete 在 JavaScript 中彼此没有任何关系(尽管它们与其他语言中完全不同的构造相似,令人困惑)。不要担心创建对象 (new) 而不显式清理它们,这是垃圾收集器的工作。

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

delete 的正确使用示例:

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

您的 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);
}

因为您通过 setInterval 分配给计时器的匿名函数将在函数调用后继续存在,它会保留对该函数调用期间作用域内所有内容的实时引用(无论它是否使用它或不)。这会将 listOfThings 指向的事物列表保存在内存中。如果计时器功能不需要该列表,那就是一个问题。如果您知道该函数不需要它,您可以释放 listOfThings 指向的列表,方法是将 undefinednull 或其他任何内容分配给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);
}

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

关于javascript - `new` 没有 `delete` 在 Javascript 中的相同变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4869712/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com