一、闭包的定义
闭包是JavaScript中,函数的一种高级应用方式。
二、闭包的三个生成条件
- 在函数 A 内部直接或者间接返回一个函数 B。
- 在B 函数内部使用着 A 函数的私有变量(私有数据)。
- A函数外部有一个变量接受着函数 B 形成了一个不会销毁的函数空间。
三、什么是闭包空间?
- 函数内部的函数。
- 一个不会销毁的 a 函数的执行空间叫做 闭包空间。
- 把函数a里面返回的b 叫做函数a的 闭包函数。
function a(){
// 这个num 变量就是函数 a 的私有变量
var num = 100
return function b(){
console.log(num)
}
}
// res接受的 就是函数 a 内部返回的复杂数据类型(函数b)
// 导致函数a的执行空间不会被销毁
var res = a()
// res 随时可以调用
res()
四、闭包的特点
注:(优点和缺点并存)
1. 延长了变量的生命周期
+ 优点: 因为执行空间不销毁, 变量也没有销毁
+ 缺点: 因为执行空间不销毁, 会一直存在在内存中
2. 可以访问函数内部的私有变量
+ 优点: 利用闭包函数可以访问函数内部的私有变量
+ 缺点: 执行空间不会销毁, 会一直存在在内存中
3. 保护私有变量
+ 优点: 保护私有变量不被外界访问
+ 缺点: 如果向访问, 必须要利用闭包函数
五、闭包总结
- 有一个函数A , 在函数A内部返回一个函数B
//函数A
function funA(){
var int = 100
//返回值函数B
return function funB(){
var num = int
return num
}
}
- 在函数B 中访问函数A 的私有作用域变量
// 函数B访问函数A的变量
function funA(){
var int = 100
return function funB(){
// 函数B中访问函数A中定义的变量int
var num = int
return num
}
}
- 在函数A 外部,有变量引用函数B
// 函数A外部有变量引用函数B
function funA(){
var int = 100
return function funB(){
var num = int
return num
}
}
// 调用函数A,执行结果就是函数B
let f1 = funA()
// 引用f1(),实际上就是应用函数B
let f2 = f1()