原理:找到不再使用的变量,回收掉
方式

  • Mark-and-Sweep

Values that go out of scope will automatically be marked for reclamation and will be deleted during the garbage-collection process.

  • Reference Counting

Reference Counting中的循环引用,

  1. let element = document.getElementById("some_element");
  2. let myObject = new Object();
  3. myObject.element = element;
  4. element.someObject = myObject;

JavaScript已经不使用Reference Counting了,
但是BOM和DOM采用的是Reference Counting方式,循环引用无法清除
解决办法:手动指向null

  1. myObject.element = null;
  2. element.someObject = null;

触发机制:当内存使用达到一定程度就启动垃圾回收

因为let, const是块级作用域,用完就清除,所以能提升性能表现

内存泄漏

内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

  1. 不用关键字声明变量

    1. function setName() {
    2. name = 'Jake';
    3. }
  2. setInterval

    1. let name = 'Jake';
    2. setInterval(() => {
    3. console.log(name);
    4. }, 100);
  3. 闭包

    1. let outer = function() {
    2. let name = 'Jake';
    3. return function() {
    4. return name;
    5. };
    6. };