【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
 }
}

使用时

<script> type='text/JavaScript' src='a.js'</script>
<script>
 var c = a()//返回对象 {sayA:sayA,sayB:sayB}
 c.sayA()//调用 sayA 和 sayB 函数
 c.sayB()
</script>

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
 }
})()

使用时

<script> type='text/JavaScript' src='a.js'</script>
<script>
 //由于在函数定义时接着自调用了,所以引入的时候函数 a 已经调用过了
 a.sayA()//调用 sayA 和 sayB 函数
 a.sayB()//
</script>

5、闭包的缺点

问题:

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

解决:

  1. 能不用就不用
  2. 内存释放(赋值为 null)
posted @ 2022-01-27 16:15  RikkaXl  阅读(36)  评论(0)    收藏  举报