【JavaScript】闭包


1、闭包的定义

当一个嵌套的内部子函数引用了嵌套的外部变量(函数),就会产生闭包

2、产生闭包的条件

  1. 嵌套函数
  2. 内部函数引用了外部函数的数据(变量或者函数)
  3. 现在:引用了内部函数才会产生闭包。之前:执行内部函数的定义(只要执行了内部函数的定义就会产生,无需调用内部函数执行)

3、闭包的作用

  1. 使用函数内部的变量在函数执行完后,任然存活在内存中(延长了局部变量的生命周期)
  2. 让函数外部可以操作(读写)导函数内部的数据(变量/函数)

4、闭包向外暴露

1、通过 return 返回一个对象

function a(){
 //定义一个变量
 var b = "BB"
 //定义两个函数,产生闭包
 function sayA(){
  console.log(b+"sayA")
 }
 function sayB(){
  console.log(b+"sayB")
 }
 //向外暴露两个函数
 return {
  sayA:sayA,
  sayB:sayB
 }
}

使用时



2、通过 window 添加对象

(function a(){
 //定义一个变量
 var b = "BB"
 //定义两个函数,产生闭包
 function sayA(){
  console.log(b+"sayA")
 }
 function sayB(){
  console.log(b+"sayB")
 }
 //向外暴露两个函数
 window.a = {
  sayA:sayA,
  sayB:sayB
 }
})()

使用时



5、闭包的缺点

问题:

  1. 函数执行完后,函数内的局部变量没有释放,占用内存的时间变长
  2. 容易造成内存泄漏

解决:

  1. 能不用就不用
  2. 内存释放(赋值为 null)