作者eight0 (人类)
看板Ajax
标题Re: [问题] js闭包的基础观念疑问
时间Sun Jan 5 22:27:42 2020
你对 GC 有点误会。
JavaScript 标准中虽然有定义资料的范围、operation,但是并没有定义要如何将
资料存入记忆体。
举例来说,大部份的 JS 引擎都会把整数存成 int、浮点数存成 double。但其实
标准中这些都是「数字」(Number)。
GC 也一样,根据不同的存法,不同的引擎也有不同的释放法。
※ 引述《paul09253336 (paulma)》之铭言:
: 当function greet执行完毕,便会离开execution stack
: 而在一般状况js会透过garbage collection清除变数内容,
不太清楚你所说的「一般状况」是指什麽状况,下面给一个永远不会释放的例子︰
function greet(word)
{
console.log(word);
}
console.log = obj => {
setInterval(() => {
console.error(obj.length);
}, 1000);
};
greet("test");
// 无论过多久「"test"」这串字串永远都会留在记忆体内不会被释放。
某个资料占用记忆体,唯一可以释放它的时机就是「当资料不会被用到的时候」。
上面的例子中,因为该字串一直被使用,所以它永远不会被释放。
这个「不会被用到的时候」,一般称为「unreachable」。
大部份的引擎都是在程式执行一阵子後,才去检查哪些资料是 unreachable
并且释放它们,不太可能每执行完一个函式就执行一次 GC。
回到你的问题︰
: js的garbage collection是在什麽时候会执行?
根据不同的实作(e.g. 不同的浏览器),任何时候都有可能。
你想关注的应该不是 GC 的时机,而是何时资料会变成 unreachable。
想要了解的话,Google "JavaScript Scope Chain" 应该有许多不错的图文说明。
如果想要了解 GC 的详细机制,可以参考 v8 的这篇文章︰
https://v8.dev/blog/trash-talk
--
ヾ(;ω;) ヾ(;ω;)
http://i.imgur.com/oAd97.png
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.225.114.151 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Ajax/M.1578234465.A.AC0.html
1F:推 paul09253336: 谢谢你的回覆 我大概知道我哪边观念有问题了 01/06 07:56
2F:推 paul09253336: 至於说“一般状况”是指 什麽状况,我也不太清楚, 01/06 07:58
3F:→ paul09253336: 这是影片的讲者说的,而且就这一句而已,所以才听 01/06 07:58
4F:→ paul09253336: 不太懂, 01/06 07:58