Re: [问题] js闭包的基础观念疑问

楼主: eight0 (欸XD)   2020-01-05 22:27:42
你对 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
作者: paul09253336 (paulma)   2020-01-06 07:56:00
谢谢你的回复 我大概知道我哪边观念有问题了至于说“一般状况”是指 什么状况,我也不太清楚,这是影片的讲者说的,而且就这一句而已,所以才听不太懂,

Links booklink

Contact Us: admin [ a t ] ucptt.com