• 作者:老汪软件技巧
  • 发表时间:2024-09-14 15:02
  • 浏览量:

闭包示例如下

function outer() {
  var data = "sensitive data";
  return function() {
    console.log(data);
  };
}
var innerFunc = outer(); // 获取闭包函数
innerFunc(); // 在外部调用闭包函数,导致 data 变量一直存在于内存中

在 JavaScript 中,变量是否会留在内存中取决于它们是否被引用。如果一个变量在任何地方都没有被引用,JavaScript 的垃圾回收器会在合适的时机回收它的内存。data 变量是在 outer 函数的局部作用域内定义的。当 outer 函数执行完毕后,如果没有其他引用指向 data,那么它应该会被垃圾回收器回收。但是,由于 innerFunc 仍然引用着 data(因为它是 outer 函数的引用),所以 data 不会被立即回收。要确保 data 被回收,需要消除对 data 的所有引用。

使用立即执行函数表达式(IIFE):通过立即执行一个函数表达式来创建一个封闭的作用域,这样可以避免 data 在全局作用域中被引用。

var innerFunc = (function() {
  var data = "sensitive data";
  return function() {
    console.log(data);
  };
})();
innerFunc(); 

显式地设置闭包引用为null在不再需要闭包时,可以显式地设置闭包引用为null,这样就可以让垃圾回收器回收闭包所引用的内存。

_内存泄漏场景_内存泄漏是指

var innerFunc = outer();
innerFunc(); // 调用闭包函数
innerFunc = null; // 释放闭包引用

使用WeakMap可以使用WeakMap来存储闭包引用,这样即使闭包不再活跃,也能让垃圾回收器有机会回收相关内存。

var weakMap = new WeakMap();
function outer() {
    var data = "sensitive data";
    weakMap.set(innerFunc, data); // 将闭包引用存储在 WeakMap 中
    return function() {
        console.log(data);
    };
}
var innerFunc = outer();
innerFunc();

在闭包不再需要时,可以简单地删除WeakMap中的条目:

weakMap.delete(innerFunc);

使用let和const使用let和const代替var来声明变量,这样可以限制变量的作用域,减少闭包引起的内存泄漏的风险。


上一条查看详情 +Dubbo框架的1个核心设计点
下一条 查看详情 +没有了