闭包

闭包就是能够读取其他函数内部变量的函数。

闭包有三个特点:

  1. 函数嵌套函数。
  2. 函数内部可以引用外部函数的参数和变量。
  3. 这个参数和变量不会被垃圾回收机制回收。

比如想要实现一个函数,每次调用的时候,函数内的变量实现加1。

以下函数,每次调用fn,得到的a都是11 。这是因为每次调用的时候,都会重新声明a:

function fn(){
    var a = 10; 
    a++;
    console.log(a);
}
var f = fn();  
f();   
f(); 
f(); 
f();

以下函数,虽然实现了,但是a就变成了全局变量,会造成全局变量命名空间的污染。

var a = 10; 
function fn(){
    a++;
    console.log(a);

}
var f = fn();  
f();   
f(); 
f(); 
f();

所以,这个时候,我们需要闭包实现:

function addOne(){
    var a = 10; 
// a是局部变量,使用闭包后,a进化成addOne或者fn的私有(自由)变量,在函数外面可以操作a的值,每次进行加1
    function fn(){
        a++;
        console.log(a);
    }
    return fn; 
}
var f = addOne();  // addOne只执行一次,var a = 10只执行一次,只定义了一次
f(); // 11  每次执行fn,a都会加1
f(); // 12
f(); // 13
f(); // 14

一个经典的for循环例子,最终输出三个3:

for(var i=0; i<3; i++){
    setTimeout(function (){
        console.log(i);
    }, 0)
}

可以用闭包实现输出0、1、2效果:

for(var i=0; i<3; i++){
        (function(i){
            setTimeout(function (){
                console.log(i);
            }, 0)
        })(i);
    }

闭包的优点

1 可以使一个变量长期存储在内存中。

2 避免污染全局变量。

闭包的缺点

1 变量常驻内存,增加内存使用量。

2 使用不当容易造成内存泄露。

转载:

https://www.jianshu.com/p/fc654bebeee8

https://blog.csdn.net/qq_38070608/article/details/78903596

原文地址:https://www.cnblogs.com/xjy20170907/p/11425275.html