# 闭包
一个老生常谈的话题,再简单的捋捋!
# 一个函数内部的函数
function f1(){
var n = 1;
function f2(){
alert(1);
}
return f2;
}
var result = f1();
result(); // 1
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
- 外部函数并不能直接访问
f1的内部变量n,但是可以通过其内部暴露的方法访问 - 一种访问函数内部变量的手段
# 在函数外部对函数内部的局部变量进行操作
function f1(){
var n = 1;
function add(){
n++;
}
function f2(){
console.log(n);
}
return {
get: f2,
add: add
};
}
var res = f1();
res.get(); // n = 1
res.add(); // add
res.get(); // n = 2
var res_b = f1();
res_b.get(); // n = 1
res_b.add();
res_b.get(); // n = 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
其中:result = f1() = {f2, add},所以result的最终指向是包含f2的对象,但是f2内部用到了其父函数f1的变量n;这就导致f1始终在内存中没有释放。所以当执行add时n++,这时n = 2;