什么叫闭包
闭包函数: 声明在一个函数中的函数,叫做闭包函数。
闭包: 闭包就是能够读取其他函数内部变量的函数,在本质上是函数内部和函数外部链接的桥梁
闭包的三大特性
- 内嵌函数:函数嵌套函数,内嵌函数对函数中的局部变量进行访问
- 局部变量:在函数内定义有共享意义的局部变量
- 外部使用:函数向外返回此内嵌函数,外部可通过此内嵌函数访问声明在函数中的局部变量,而此变量在外部是通过其他路径无法访问的
- 参数和变量不会立即被垃圾回收机制回收
闭包的优点
- 可读取函数内部的变量
- 局部变量可以保存在内存中,实现数据共享
- 执行过程中所有变量都匿名在函数内部
闭包的缺点
- 使函数内部变量存在于内存中,内存消耗大
- 滥用闭包可能导致内存泄露
- 闭包可以在父函数外部改变父函数内部的值,慎操作
闭包的产生条件
作用域嵌套 在父级作用域里生成了一个变量 var i=0 在子作用域里使用这个变量,这样声明的那个变量 i 就是 自由变量,这种作用域嵌套环境叫做 闭包环境。
闭包的使用场景
- 模拟私有方法
- setTimeout循环
- 匿名自执行函数
- 结果要缓存场景
- 实现类和继承
比如,我想做个计数器。点击一下加1。听起来很简单。代码如下:
上面的代码实现了想要的功能。但是,有一个安全隐患。变量counter除了函数add可以更改,其他任何代码都可以改变counter的值。
安全的做法是,只有函数add可以更改counter的值。就像有人提出的一样。把counter改成局部变量。那代码如下:
我们可以把开始的代码放到一个块里,就可以完美解决