js闭包
# 一. 闭包
如果在内部函数使用了外部函数的变量, 就会形成闭包. 闭包保留了外部环境的引用
如果内部函数被返回到了外部函数的外面, 在外部函数执行完后, 依然可以使用闭包里的值
# 1 闭包的形成
在内部函数使用外部函数的变量, 就会形成闭包, 闭包是当前作用域的延伸
示例
function a() {
var aa = 100
function b() {
console.log(aa)
}
b()
}
a()
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
演示
从代码的角度看, 闭包也是一个对象, 闭包里包含哪些东西呢?
在内部函数 b 中使用了外部函数 a 中的变量, 这个变量就会作为闭包对象的属性!!
思考
function a() {
var aa = 100
function b() {
console.log(b)
}
b()
}
a()
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
- 会不会形成闭包?
- 如果形成, 闭包里有什么?
答案
会形成闭包, 由于 b 的声明是在外部函数 a 中的, 在内部函数 b 中使用了 b, 会形成闭包
闭包里存放了一个属性, 就是 b 函数
思考
function a() {
var aa = 100
function b() {
var b = 200
console.log(b)
}
b()
}
a()
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
- 会不会形成闭包?
答案
不会形成闭包, 由于在 b 函数内部定义了变量 b, 打印时直接使用的是内部函数里的变量 b, 不会形成闭包
# 2 闭包的保持
如果希望在函数调用后, 闭包依然保持, 就需要将内部函数返回到外部函数的外部
示例
function a() {
var num = 0
function b() {
console.log(num++)
}
return b
}
var demo = a()
console.dir(demo)
demo()
demo()
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
第 8 行, 调用 a 函数, 将内部函数 b 返回, 保存在函数 a 的外部
第 9 行, 调用 demo 函数, 实质上是调用内部函数, 在函数 b 的[[scopes]]属性中可以找到闭包对象, 从而访问到里面的值
# 3 总结
使用闭包要满足两个条件
- 闭包要形成: 在内部函数使用外部函数的变量
- 闭包要保持: 内部函数返回到外部函数的外面
如果觉得有帮助, 可以微信扫码, 请杰哥喝杯咖啡~
上次更新: 2021/09/03, 15:32:17