JavaScript 关于垃圾回收器和闭包的关系
垃圾回收器: 一个在JavaScript引擎中的浏览器程序,它可以冻结未使用的内存。在像C/C++这样的编程语言中,我们通常决定如何获取内存,如何对内存进行分配或释放,这基本上是由开发人员来决定的。但是在像JavaScript这样的高级语言中,大部分工作都是由JavaScript引擎完成的,因此浏览器中有垃圾回收器来处理未使用的内存。
你可以从这里阅读 闭包 。
垃圾回收器和JavaScript中闭包的关系: 在JavaScript中使用闭包的最大缺点是会过度消耗内存,并且闭包中不需要的闭合变量 不会被回收 ,从而导致 内存泄漏 。
示例1: 下面的示例涵盖了基本垃圾回收器的概念。
Javascript
<script>
function a() {
var x = 10;
return function b() {
console.log(x);
}
}
var y = a();
y();
</script>
输出:
10
所以在上面的代码中,如果函数b不存在并且不与变量x形成闭包,那么变量x将会被垃圾回收。但是由于函数b存在于函数a内部并且与变量x形成闭包,所以当函数b返回时,变量x无法被垃圾回收。但是在现代JavaScript v8 chrome引擎中存在着 智能垃圾回收器 的概念。
示例2: 以下示例涵盖了智能垃圾回收器的概念。
Javascript
<script>
function a() {
var x = 10,
z = 92;
return function b() {
console.log(x);
}
}
var y = a();
y();
console.log(z);
</script>
输出:
10
Uncaught ReferenceError: z is not defined
在闭包中,变量z和变量x都与 函数b 相关联,但由于在函数b中没有使用z,所以z会被 垃圾回收 ,而x则不会被垃圾回收。这就是垃圾收集和闭包的洞见关系。
参考文献: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management#garbage_collection