闭包的概念:
闭包是可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。在编程领域我们可以通俗的说:子函数可以使用父函数中的局部变量,这种行为就叫做闭包!
闭包的作用:
在说闭包的作用之前,让我们来先看看下面一段代码:
<script type="text/javascript">
function test1(){
var i=0;
function test2(){
alert(++i);
}
return test2;
}
var temp = test1();
temp();
</script>
运行这段代码后,我们发现,弹出窗的结果是:1。
现在,让我们慢慢分析这段代码。首先,代码自上而下执行,第一部:执行了temp=test1()以后,temp实际上等同于test2;第二部:执行了temp函数;很明显,打印出的1一定是执行了test2这个函数的结果,但是变量i的声明是在test1内部,而执行temp函数是在test1外部,这就关系到一个变量的作用域问题。在JS中,变量按作用域来分分为局部变量和全局变量两种,这里i明明声明的是一个局部变量,却能在代码的全局中得到其值,这功能是非常强大的。假设我们在函数的外面写一句:var m=temp();这样,我们就能时时刻刻得到在函数test1里声明并运行的变量i了,这样就间接的改变了i的作用域,让i变成了一个”伪全局变量“。
综上可以看出,闭包是可以改变变量或者函数作用域的函数或者方法,使用闭包能在某些时候轻松的得到我们想得到的变量值或者方法。
闭包的使用方法:
一般来说,闭包的使用方法就是在声明一个变量的下面或者一个方法的内部再声明一个方法,在这个新声明的方法里,我们利用相对于他自身的”全局变量“进行”运算“,将得到的值或者结果通过return返回回去,然后在整个函数或者方法的外面去接收这个返回值,使在函数内部声明的变量或方法能在函数外面被利用,这样的使用方式就是闭包的使用方法。如同上面的函数test2一样,在test2里面去处理i,然后在test1外面去申明一个变量m=temp();用以接收变量i处理后的值,这个就实现了闭包的过程。