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