js的闭包内存泄露

113 阅读1分钟

js的闭包内存泄露

js闭包内存泄漏案例

// js内存泄露不会出现安全问题.但是会卡死

function createFnArray() {
  //  1kb = 1024byte    4byte * 1024 = 4kb      4kb = 1024byte * 4
  //  1024 * 1024 * 4byte = 4m
  //  占据的空间是4m x 100(个数) + 其他内存 = 400m+
  //  正常来说 number 占据8byte,但js引擎对特别小的数字类型(2的32次方)进行优化,使其占4byte
  var arr = new Array(1024*1024).fill(1) // 1个整数占据4个字节
  return function(){
    console.log(arr.length);
  }
}

// var arrayFn = createFnArray()
// arrayFn = null

// 100 * 100 = 10000 = 10s
var arrayFns = []
for (var i = 0; i < 100; i++) {
  setTimeout(() => {
    arrayFns.push(createFnArray())
  }, i * 100);
}

// arrayFns = null
setTimeout(() => {
  for (var i = 0; i < 50; i++) {
    setTimeout(() => {
      arrayFns.pop()
    }, 100 * i);
  }
}, 10000);

js闭包的自由变量如何销毁

function foo(){
  var name = 'Fhup'
  var age = 18  // js引擎会删除掉这个自由变量(优化)
  
  function bar(){
    debugger
    // 右边的 Closure (foo) 表示: bar访问foo的自由变量. 只包含name值,age被销毁
    console.log(name);
  }

  return bar
}

var fn = foo()
fn()