闭包的理解

闭包:引用了自由变量的函数,这个被引用的变量和这个函数一同存在,即使已经离开创造他的环境。

var a=function(){
        var test={};
        setInterval(function(){
            console.log(test);
        },1000)
    }

test在a函数中被定义。a函数执行之后其中的变量和对象都会被销毁(垃圾回收机制)。但由于test被一直调用,所以不会被销毁。直到定时器停止。这个定时函数就是一个闭包。

var obj=function(){
        var a='';
        var jju='hellow';
        return{
            set:function(val){
                a=val;
            },
            get:function(){
                return a;
            }
        };
        return jju;
    };
    var b =obj();
    b.set('new val');
    console.log(b.get());//new val;

obj函数里面定义了a和返回了一个对象,这个对象有set和get方法。执行完var b=obj();之后obj中的内容会被销毁。但是返回的b还能调用这两个方法,所以a也就还存在。这里要注意的是函数执行完之后会销毁其中的上下文,但是闭包会把需要的变量(引用的那个变量)复制到闭包里面去,并不是保存整个过程的上下文。

//好处,
//1.可以使一个变量长期驻扎在内存当中。
//2.避免全局变量的污染
//利用函数表达式和匿名函数的立即调用将函数写成:

var aaa=(function(){
var a=1;
return function(){
a++;
alert(a);
}
})();
aaa();
aaa();


//我们通常把上面这段叫做模块化代码,避免全局变量的污染。
//3.私有成员的存在。下面这段代码可以理解为模块化代码的模型,样子

var aaa=(function(){
var a=1;
function bbb(){
a++;
alert(a);
}
function ccc(){
a++;
alert(a);
}
return {
b:bbb;
c:ccc;
}
})();
console.log(aaa.b);
console.log(aaa.c);
原文地址:https://www.cnblogs.com/jjucap/p/5532403.html