闭包:引用了自由变量的函数,这个被引用的变量和这个函数一同存在,即使已经离开创造他的环境。
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);