0%

JavaScript 闭包学习

闭包,简单来说就是可以读取其他函数内部变量的函数。只要满足这一点的函数,都可以叫闭包。

1
2
3
4
5
6
7
8
9
10
11
function example() {
var n = 1;
return fun(){
alert(n++)
};
}

var fun = example();
fun();
// 1 执行完后 n++,变量n任然存在于内存中 fun();// 2 fun = null;// n被回收

这里就是典型的从 function example 外部访问了内部的 变量 n. 这就是闭包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function example1(){
var n=1;
Add = function() {
n+=1
}
function example2(){
alert(n);
}
return example2;
}
var result=example1();
result();
// 1 Add(); result(); // 2

上面的代码中第一个” result(); “执行完以后,输出结果 “1”,第二的” result(); “执行完以后,输出结果 “2”,这就证明了,函数 example1 中的局部变量n一直保存在内存中,并没有在第一个” result(); “执行完以后被自动清除;才能在执行第二个”result(); “完以后,输出结果 “2”,如果这样就容易造成我们平时所说的全局空间污染。

还需要注意的是,上面的 Add=function(){n+=1} 这部分代码,一看这家伙居然没有名字(匿名函数),而且,变量还是没通过 var 去命名的,所以呢,就定义成了一个全局变量,所以外部函数当然可以对它”拳打脚踢”的操作咯;所以就有了Add(); 执行以后,第二个 result();才能实现 n 的累加输出 “2”。