闭包是什么
所谓的闭包是一个引用关系,该引用关系存在于内部函数中,引用的是外部函数的变量的对象。 简单的说:假如一个函数能访问外部的变量,那么就形成了一个闭包,而不是一定要返回一个函数。
let a = 1
// 产生闭包
function fn() {
console.log(a);
}
function fn1() {
let a = 1
// 产生闭包
return () => {
console.log(a);
}
}
const fn2 = fn1()
fn2()
实例
总结:本质就是上级作用域内变量的生命周期,因为被下级作用域内引用,而没有被释放。就导致上级作用域内的变量,等到下级作用域执行完以后才正常得到释放。
闭包产生条件
- 函数嵌套
- 内部函数引用外部函数的局部变量
- 使用外部函数
常见的闭包
- 将函数作为另一个函数的返回值
- 将函数作为实参传递给另一个函数调用
- 使用闭包实现私有方法操作独立的私有属性
闭包的作用
- 延长外部函数变量对象的声明周期
- 让函数外部可以操作(读写)到函数内部的数据(变量/函数)
- 注意: 浏览器为了性能后期将外部函数中不被内部函数使用的变量清除了
闭包的声明周期
- 产生: 在嵌套内部函数定义执行完时就产生了(不是在调用)
- 死亡: 在嵌套的内部函数成为垃圾对象时
底层原理
- new了一份变量