Skip to content
导航栏

02_闭包模型-内存泄漏

1. 形成闭包的条件

  • 闭包让你可以在一个内层函数中访问到其外层函数的作用域
  • 闭包跟函数是最大的区别在于,当捕捉闭包的时候. 它的 自由变量 会在捕捉被确定, 这样即使脱离的捕捉时的上下文, 它能照常运行.
  • 从广义来讲: JavaScript 中的函数都是闭包
  • 从狭义来讲: JavaScript 中的函数只有在使用了外层自由变量的时候才是闭包
js
function foo() {
  var a = 2;
  function bar() {
    // 闭包: 访问了外层函数的变量
    console.log(a);
  }
  return bar;
}

var fn = foo();
fn(); // 2

2. 数组中函数的使用

  • filter
  • map
  • forEach
  • reduce
  • find/findIndex

3. 闭包导致的内存泄露

3.1 引用大量闭包

js
function createFnArray() {
  var arr = new Array(1024 * 1024).fill(1);
  return function () {
    console.log(arr.length);
  };
}

var arrayFn = [];

for (var i = 0; i < 300; i++) {
  arrayFn.push(createFnArray());
}

setTimeout(function () {
  arrayFn = null;
}, 3000);
  • 此函数会导致浏览器加载时候,出现大量的内存占用,并且不能被回收
  • 由于闭包的存在,导致函数内部的变量无法被回收

3.2 没有用的闭包变量(销毁情况)

js
function foo() {
  var name = "asd";
  var age = 14;

  function bar() {
    console.log(name);
  }

  return bar;
}

var fn = foo();
fn();
  • 上面代码 因为 age 没有被使用, JS 引擎会自动将其销毁