来看一段代码

var obj = (function(){
  var num = 0;
  return {
    'getNum': function(){
      return ++num;
    }
  }
})();
console.log(obj.getNum());// 1
console.log(obj.getNum());// 2
console.log(obj.getNum());// 3

这段代码有两个特点:

  1. 函数getNum嵌套在函数中
  2. 外层函数返回内层函数

什么是闭包

闭包就是能够读取其他函数内部变量的函数,只有函数内部的子函数才可以读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包就是将函数内部和函数外部连接起来的桥梁。

闭包的作用就是在函数执行完成后,函数中的变量始终存在内存中,闭包使得垃圾回收机制不会回收函数中的占有的资源,因为函数的内部始终依赖着变量。

垃圾回收机制

在JavaScript中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第三者所引用,那么这两个互相引用的对象也会被回收。

要注意的

  1. 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成性能问题,解决方法是在退出函数之前,将不使用的局部变量全部删除。
  2. 闭包会在父函数外部,改编父函数内部变量的值。所以把福函数当做对象使用,把闭包当做它的功用方法,把内部变量当做它的私有属性,这时一定要小心,不要随便改变父函数内部变量的值。