当变量超出作用域时的JavaScript垃圾回收

5

JavaScript支持垃圾回收吗?

例如,如果我使用:

function sayHello (name){
    var myName = name;
    alert(myName);
}

我需要使用“delete”删除myName变量吗,还是我可以忽略它?

绝对不,CTO:http://www.codingforums.com/archive/index.php/t-157637.html - Rakesh Juyal
请重新标记/命名:这与优化无关。我建议使用“JavaScript变量作用域”。 - kdgregory
请参阅有关JS GC的问题 - https://dev59.com/Z3RA5IYBdhLWcg3wsgBP - Kobi
5个回答

7

不是用于内存管理,delete 用于从对象中删除属性。


4

JavaScript支持垃圾回收。在这种情况下,由于您在函数内明确声明变量,因此它将(1)在函数退出时超出范围,并在此之后的某个时间被收集,以及(2)不能成为delete的目标(参见下面链接的参考资料)。

delete可能有用的地方是如果您隐式声明变量,这将使它们处于全局范围内:

function foo()
{
    x = "foo";   /* x is in global scope */
    delete x;
}

然而,隐式定义变量是一种不好的做法,因此请始终使用var,这样您就不必担心delete

更多信息,请参见:https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Special_Operators/delete_Operator


4

不必在意它 - 在sayHello函数完成后,myName超出作用域并被垃圾回收。


1

1

正如其他人所提到的,当函数退出时,您的变量就会超出范围,因为它的作用域仅限于函数内部,因此垃圾回收器可以清理它。

但是,如果该变量被函数外部的某些东西引用,那么它可能不会被垃圾回收很长一段时间,甚至永远不会被回收,因为它仍然有一个引用。

您可能需要了解一下JavaScript中的作用域: http://www.webdotdev.com/nvd/content/view/1340/

使用闭包可能会导致内存泄漏,这可能是您试图处理的问题,并且与我提到的问题有关: http://www.jibbering.com/faq/faq_notes/closures.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接