闭包的应用
# 二. 闭包的应用
# 1 闭包的两面性
任何事物都有两面性
好处: 一般来说, 在函数外部是没办法访问函数内部的变量的, 设计闭包最主要的作用就是为了解决这个问题.
坏处: 有时不注意使用了闭包, 会导致出现意想不到的结果
# 2 闭包的应用
- 在函数外部访问私有变量
- 实现封装
- 防止污染全局变量
示例
在函数外部访问私有变量
function a() {
var num = 0
function b() {
console.log(num++)
}
return b
}
var demo = a()
console.dir(demo)
demo()
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
本来在函数 a 的外部(全局)不能直接访问内部变量 num, 通过闭包就可以使用 num 变量了
示例
function Person() {
var uname
function setName(uname) {
this.uname = uname
}
function getName() {
return this.uname
}
return {
getName: getName,
setName: setName,
}
}
var xiaopang = Person()
xiaopang.setName('xiaopang')
var name = xiaopang.getName()
console.log(name)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
定义了一个函数 Person, 一个内部变量 uname, 两个内部函数
返回内部函数, 也是使用了闭包特性
这样在 Person 函数的外部, 通过 get 和 set 方法对变量 uname 进行操作, 这就是面向对象
里的封装的思想
# 3 闭包的问题
在很多时候, 我们写的代码会无意识的用了闭包, 但是这并不是我们想要的结果.
这种情况应该尽量避免, 或者说遇到了这类 bug 时, 我们应该知道如何解决
示例
var arr = []
for (var i = 0; i < 10; i++) {
arr[i] = function() {
console.log(i)
}
}
arr[0]()
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
- 会不会形成闭包?
- 打印结果是什么?
- 为什么
示例
var arr = []
function a() {
for (var i = 0; i < 10; i++) {
arr[i] = function() {
console.log(i)
}
}
}
a()
arr[0]()
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
- 会不会形成闭包?
- 打印结果是什么?
- 为什么
虽然看起来结果一样, 但是执行的过程有很大的差异~
现在问题是如果希望依然打印 0~9, 该怎么解决
如果觉得有帮助, 可以微信扫码, 请杰哥喝杯咖啡~
上次更新: 2021/09/03, 15:32:17