高级JS-内存管理-闭包

43 阅读2分钟

垃圾回收

大部分现代的编程语言都是有自己的垃圾回收机制:垃圾回收的英文是Garbage Collection,简称GC;对于那些不再使用的对象,都称之为是垃圾,它需要被回收,以释放更多的内存空间

  • 常见的GC算法 – 引用计数

    1. 当一个对象有一个引用指向它时,那么这个对象的引用就+1
    2. 当一个对象的引用为0时,这个对象就可以被销毁掉

    这个算法有一个很大的弊端就是会产生循环引用

  • 常见的GC算法 – 标记清除

    1. 设置一个根对象,垃圾回收器会定期从这个根开始,查找所有从根开始有引用到的对象
    2. 对于那些没有引用到的对象,就认为是不可用的对象,就清除

    这个算法可以很好的解决循环引用的问题

闭包

一个普通的函数,如果可以访问外层作用域的自由变量,那么这个函数和周围环境就是一个闭包

从广义的角度来说:js中的函数都是闭包

从狭义的角度来说:js中一个函数,如果访问了外层作用域的变量,那么它是一个闭包

function createAdd(count) {
   function adder(num) {
       return count + num
   }
   return adder
}

var adder4 = createAdd(4)
console.log(adder4(200)); // 204

var adder6 = createAdd(8)
console.log(adder6(8)); //16

闭包使得原本该销毁的作用域由于内部函数的引用没有销毁 始终存在在堆内存中 因此产生了内存泄露

  • 解决
    • 将保存着上层作用域引用的函数在使用完之后置为null将它的引用销毁在GC的下一次检查中对应的内存就会被销毁