theme: geek-black
highlight: a11y-dark
「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战」。
前言
- 大家好,我是前端沸人vike
- 这篇让我们一起来了解闭包
什么是闭包
- 简单来说:
- 闭包是创建私有变量的一种方式
- 既能反复使用变量又能保证环境不被污染
- 闭包也是一个对象
- 简单的闭包 示例
- 闭包要素:
- 外部函数嵌套内部函数
- 内部函数使用外部函数的变量
- 闭包要素:
```js function fn() { var a = 2; return function () { a++; console.log(a) } }
fn()() // 3 console.log(a) // ReferenceError: a is not defined ```
为什么需要闭包
- 维护一个私有变量,全局环境容易被污染
- 内部函数能反复使用外部变量
闭包除了有私有变量 还能维护私有方法
牛刀小试:
- 实现一个数字累加
- 普通函数版本 如果更改全局变量 整个程序会造成影响 ```js // 不使用闭包 var init = 0; function count(num) { init += num; console.log(init) }
- 实现一个数字累加
count(1) // 1 // 如果有同事动了代码 // init = 0 // count(2) // 2 count(2) // 3 ```
- 闭包版本
- 将变量隐藏在内部 不受外部影响
```js function count() { var init = 0; return function (num) { init += num console.log(init) } }
let a = count() a(1) // 1 a(2) // 3 ```
怎么解决闭包的缺陷
- 闭包的取舍:
- 在性能方面,闭包是较为消耗性能的,如果可以用其他方式解决的情况下,尽量不要使用闭包
- 闭包会导致内存溢出 使用结束的变量不会被回收
- 普通函数的回收
- 函数在调用的时候才会创建本地作用域
- 调用结束以后立即销毁本地作用域
js function fn() { var a = 1; console.log(a) } fn() // 1
- 闭包的回收
- 闭包在使用结束以后变量还存在内存中
- 此时应该手动把变量设置为null 这样就会触发JS的垃圾回收机制
结语
- 谢谢大佬们的阅读,如果觉得本文对你有帮助的话,留下个赞吧!