千锋逆战班,木子打卡第一天
首先,了解闭包我们需要首先了解一下函数的两个阶段
一、函数的两个阶段
1.函数定义阶段
1. 开辟一个函数存储空间
2. 把代码存放再函数存储空间内
3. 把空间地址赋值给函数名
2.函数调用阶段
1. 按照函数名存储的地址找到存储空间
2. 再次开辟一个函数执行空间
3. 在执行空间内部进行形参赋值
4. 在执行空间内部进行预解析
5. 把存储空间的代码复制一份到执行空间内部执行
6. 代码执行完毕以后, 执行空间销毁
3.什么是一个不会销毁的函数执行空间?
当函数里面返回一个复杂数据类型
并且在函数外部有变量引用这个被返回的复杂数据类型的时候
这个函数执行空间不会销毁
这时res接收的是一个数组,这个执行空间不会被销毁
二、什么是闭包?
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/53d50d07fea440f3a1c9ac29fb542d2b.png)
res接受的就是a函数执行之后的返回值,返回的是一个复杂数据类型(函数b)闭包就是函数内部的函数
三、闭包生成的三个必要条件
1.函数 A 内部直接或者间接返回一个函数 B
2.函数 B 内部使用着函数 A 的私有数据
3.函数 A 外部有变量引用着函数 B
形成一个不会销毁的空间
小延展:什么叫直接或间接返回函数b?
直接:直接返回一个函数return function b() {}
间接:间接返回一个函数,return一个对象或数组,这个对象或数组里面有一个函数
Return的是一个对象,对象里包含着函数
四、 闭包的特点
1. 延长变量的声明周期
优点: 变量会一直存在
缺点: 一个不会销毁的函数执行空间
2. 可以在函数外部访问内部数据
优点: 函数外部访问内部数据
缺点: 一个不会销毁的函数执行空间
3. 保护私有变量
优点: 内部的变量不能再外部访问
缺点: 闭包空间可以访问内部数据
五、闭包的应用
多用于循环绑定事件,否则点击事件是打印出的i始终存在变量泄露,使用闭包延长了变量的声明周期
中国加油,武汉加油。千锋加油,我自己加油!