闭包就是能够读取其他函数内部变量的函数。由于在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。
要了解闭包,首先了解函数,函数分为两个阶段。
函数定义阶段:
- 在内存中开辟一个存储空间
- 把函数体内的代码当作字符串一摸一样的放在这个空间中,碰到的所有变量都不进行解析
- 把这个空间地址赋值给函数名(变量名)
函数调用阶段
- 按照函数名(变量名)找到对应的存储空间
- 从新开辟一个函数 执行空间
- 在这个执行空间里面进行形参赋值
- 在这个执行空间里面进行预解析
- 把函数存储空间的代码复制一份到执行空间里面执行一遍
- 执行完毕之后, 这个开辟出来的执行 空间销毁
注意: 每一次函数调用都会开辟一个执行空间
调用一次,开辟一个执行空间,执行完毕代码销毁。
再次调用的时候,再次开辟一个执行空间,执行完毕代码销毁
闭包:
function a(){
//这个num变量就是函数a的私有变量
var num = 100;
return function b(){
console.log(num);
}
}
//res接受的就是函数a内部返回的一个复杂数据类型(函数b)
var res = a();
//res接受的就是函数b的执行空间的地址,就是函数a执行以后的返回值
res()
// 当 res 调用的时候, 打印 num
// 打印出来的就是 a 函数内部的私有变量 num 的值
闭包的三个条件:
1.在函数A内部直接或者间接返回一个函数B
2.B函数内部使用着A函数的私有变量(私有数据)
3.A函数外部有一个变量接收着函数B,形成了一个不会销毁的函数空间
闭包的特点:
- 延长了变量的生命周期
优点: 因为执行空间不销毁, 变量也没有销毁
缺点: 因为执行空间不销毁, 会一直存在在内存中 - 可以访问函数内部的私有变量
优点: 利用闭包函数可以访问函数内部的私有变量
缺点: 执行空间不会销毁, 会一直存在在内存中 - 保护私有变量(只要是函数, 就有这个特点)
优点: 保护私有变量不被外界访问
缺点: 如果向访问, 必须要利用闭包函数
闭包的作用:
- 就是当你需要延长变量的声明周期的时候
- 或者你需要访问某一个函数内部的私有数据的时候
- 你可以使用 闭包 函数来解决
来源:CSDN
作者:当你死了
链接:https://blog.csdn.net/weixin_46199736/article/details/104467851