gpt4 book ai didi

javascript - 如何关闭内存GCed?

转载 作者:行者123 更新时间:2023-11-30 09:23:48 25 4
gpt4 key购买 nike

全部:

我是 javascript 管理的新手,当我试图了解 GC 如何处理闭包时,我运行了一个示例:

function addN(n){
var title = "ADD "+n;
return function adder(who){
return who+n;
}
}
var add3 = addN(3);
var result = add3(10);

我想知道在 addN 完成为 add3 构建闭包之后,title 是否仍然保留在内存中,还是只是 n

另一个例子是:

var globaltable = []
function addNarray(narray){
// narray is an string array
var titles = narray.slice(0);
globaltable = globaltable.concat(titles);
return function adder(who){
return narray.join(" - ");
}
}

在这个例子中,title 会得到 GC 吗

而且我还想知道如果 narray 是像 {id:0, name:"idname"} 这样的对象数组,答案会一样吗?

如果有人知道答案,请分享想法,非常感谢 chrome devtool 的证明方法,或者从内存使用的 Angular 解释一下

谢谢

最佳答案

您可以使用 console.dir(add3); 查看闭包的构造。展开 [[Scopes]] 属性,然后展开 0: Closure 对象,您只会看到:

n: 3

闭包不会在任何地方保存 title 的值。

在第二个例子中,titles 变量仍然被垃圾回收。当你这样做时:

var titles = narray.slice(0);
globaltable = globaltable.concat(titles);

发生以下情况:

  1. narray 的副本由slice() 创建,并存储在局部变量titles 中。
  2. 包含 globaltable 内容的新数组,后跟 titles 内容。
  3. 这个新数组存储在 globaltable 中。

此时 globaltable 的旧值变成了垃圾。当 addNarray() 返回时,titles 的值变成垃圾,因为 adder() 中的闭包没有对它的任何引用。

titles 中的字符串不会变成垃圾,因为它们仍在 globalarray 中引用。 narray 不会变成垃圾,因为它是 adder 闭包中的引用。

基本上,闭包应该保存对返回函数中某处提到的变量的引用。外作用域的其他变量不需要保存。

垃圾回收的基本原理很简单:如果无法访问某条数据,则可以将其作为垃圾回收。实现中有时会出现错误,但作为一般规则,您可以假设这是真的。

关于javascript - 如何关闭内存GCed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50032985/

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