闭包(Closure)

作用

  1. 避免变量全局污染
  2. 使数据私有化,外部无法修改内部数据
  3. 可以让外部可以使用内部的私有数据

以上三点其实都是函数的作用,而不是闭包的独特作用

!闭包的核心作用是:使变量可以驻留在内存,不被回收

代码讲解

let a = 10;
function fn(){
a++;
console.log(a);
}
fn();
fn();
fn();

结果输出为11,12,13

但是此时a为全局变量,如果别人不小心对a又重复赋值了,那么结果就不是我们预期的结果

那此时我们就不让a成为全局变量,把a的定义放在函数内部,让a成为函数的私有变量

function fn(){
let a = 10;
a++;
console.log(a);
}
fn();
fn();
fn();

此时就可以满足上面提到的函数的作用(第三条只要加个return就可以实现)

但是问题出现了:这次的结果三次都为11,这是因为函数在执行完一次后里面的变量就会被释放掉,下一次执行时又会重新对a进行赋值,所以结果一直为11

创建闭包

function fn(){
let a = 10;
return function b(){
a++;
console.log(a);
}
}
let f = fn();
f();

条件:

  1. 必须有个子函数
  2. 子函数必须要调用父函数里面的变量

实现自增的原因:

  1. 执行的是f(),所以实际上执行的是子函数b,fn只在给f定义的时候执行了一次,所以后面let a = 10也没有被执行
  2. 闭包函数内的变量可以保存下来

我的疑惑:

  1. 为什么要在下面重新定义一个f函数
  2. 为什么要加return A :1.因为要返回b函数? 2.最后f调用的是a变量,(如果外部想要使用闭包里面的变量,就要用return?)

补充

内存泄漏

变量长时间驻留在内存,如果处理不当可能造成内存泄漏,所以用完可以手动清除

在最后加上下面的代码即可

f = null;