闭包

56 阅读2分钟

什么叫闭包

闭包函数: 声明在一个函数中的函数,叫做闭包函数。

闭包: 闭包就是能够读取其他函数内部变量的函数,在本质上是函数内部和函数外部链接的桥梁

闭包的三大特性

  • 内嵌函数:函数嵌套函数,内嵌函数对函数中的局部变量进行访问
  • 局部变量:在函数内定义有共享意义的局部变量
  • 外部使用:函数向外返回此内嵌函数,外部可通过此内嵌函数访问声明在函数中的局部变量,而此变量在外部是通过其他路径无法访问的
  • 参数和变量不会立即被垃圾回收机制回收

 闭包的优点

  • 可读取函数内部的变量
  • 局部变量可以保存在内存中,实现数据共享
  • 执行过程中所有变量都匿名在函数内部

 闭包的缺点

  • 使函数内部变量存在于内存中,内存消耗大
  • 滥用闭包可能导致内存泄露
  • 闭包可以在父函数外部改变父函数内部的值,慎操作

 闭包的产生条件

作用域嵌套 在父级作用域里生成了一个变量 var i=0  在子作用域里使用这个变量,这样声明的那个变量 i 就是 自由变量,这种作用域嵌套环境叫做 闭包环境。

闭包的使用场景

  • 模拟私有方法
  • setTimeout循环
  • 匿名自执行函数
  • 结果要缓存场景
  • 实现类和继承

比如,我想做个计数器。点击一下加1。听起来很简单。代码如下:

image.png

上面的代码实现了想要的功能。但是,有一个安全隐患。变量counter除了函数add可以更改,其他任何代码都可以改变counter的值。

安全的做法是,只有函数add可以更改counter的值。就像有人提出的一样。把counter改成局部变量。那代码如下:

image.png

我们可以把开始的代码放到一个块里,就可以完美解决