一、定义
js 闭包 一个函数内部函数引用这个函数,这个函数返回内部函数,这样就产生了闭包
二、应用场景
1)创建私有变量、私有方法
2)在内存中维持一个变量的值
三、弊端
闭包对脚本性能具有负面影响,包括处理速度和内存消耗,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
四、使用案例
1)
1: function fun1(){
2: var a=5;
3: function fun2(){
4: console.log(a++);
5: }
6: return fun2;
7: }
8:
9: var c = fun1();
10: c(); // 5
11: c(); // 6
fun1 返回fun2,然后把返回值赋给变量c,fun2又引用fun1的变量a,所以在c执行的时候,c引用fun1,fun1又引用fun2,fun2又引用fun1种的变量,这使垃圾回收器在fun1执行后不能回收,使a变量长期占用内存,所以c执行第二次的时候,a++ 执行了,所以结果是6
2)闭包中的变量是引用而非拷贝
1: function say1(){
2: var num = 11;
3: num++;
4: return function() {
5: return num;
6: }
7: }
8: console.log(say1()()); // 12
3) 多个函数可以引用同一个闭包,say3,say4 是全局变量,当执行完say2的时候 say3,say4被赋值了,所以say3,say4在执行完say2的时候可以直接访问。
1: function say2(){
2: var num=22;
3: say3 = function(){
4: return num;
5: }
6: say4 = function(x){
7: num = x;
8: }
9: }
10: say2();
11: console.log(say3()); // 22
12: say4(33);
13: console.log(say3()); // 33
4)
1: /** js 私有变量私有方法 单件模式
2: * privateNum 是私有变量 getPrivate() 私有方法
3: * sigono通过return来返回对私有变量和私有方法的调用
4: * */
5: var sigono = (function(){
6: var privateNum = 1;
7: function getPrivate(x){
8: return x;
9: }
10: return {
11: firstMthod : function(){
12: return privateNum;
13: },
14: secodMethod : function(x){
15: return getPrivate(x);
16: }
17: }
18: }());
19:
20: console.log(sigono);
21:
22: console.log(sigono.firstMthod()); // 1
23: console.log(sigono.secodMethod(2)); // 2
5) 同名函数里面的闭包
1: var a = 1;
2: function testA(b){
3: testA = function(b){
4: alert(a+b++); // 4
5: }
6: alert(a); // 1
7: a++;
8: alert(a); // 2
9: }
10: testA(1);
11: testA(2);
alert(a); // 1
7: a++;
8: alert(a); // 2
然后执行完一遍后,里面的testA会把外面的覆盖掉,第二次再执行里面的testA,这是变量a是函数里面的a,这时a为2,
弹出 alert(a+b++);他的值。