闭包函数又称绑定函数,一个显著的特征是,当函数在不在它所处的变量作用范围时,仍然可以使用本地变量。
(1)作为值从另一个函数中返回。(作为值从函数返回的函数都是闭包函数)
function A(){
var temp = "local temp";
B = function(){
alert(temp);
}
return B;
}
var myFunc = new A();
myFunc();
如上述代码段所示,temp作为本地变量,myFunct位于函数的作用域外部,按理来说,并不能调用temp。
但在这段代码中,实际上是可以使用的,这就是闭包函数。
(2)利用变量作用范围也可以产生闭包函数。
var F;
function A(){
var temp = "local temp";
F = function(){
alert(temp);
}
}
A();
F();
在本例中,F函数仍然可以调用本地变量temp.但是F所处的环境中其他程序并不能调用这个变量。
总的来说,闭包函数的核心就是,函数能够在任何时候,任何环境下访问函数在定义时的私有变量,这个私有变量在函数被调用的环境中是不能直接访问的。
闭包函数的应用:匿名自执行函数
想要理解闭包函数,首先必须理解js中的函数作用域和作用域链问题。
关于函数作用域,这里有一篇很好的文章:http://blog.csdn.net/yueguanghaidao/article/details/9568071
举个例子
<pre name="code" class="javascript">for(var i = 0; i < 10; i ++){
setTimout(function(){
alert(i);
},1000);
}
在这段代码中,作用链是function匿名函数-> setTimeout函数->window, 匿名函数的i值在该函数中并没有被定义,因此需要向上一级作用域寻找。又因为在第一次执行setTimeout函数之前,for循环肯定已经完成了,因此,此时i的值为10。
所以这段代码的输出结果会alert 十次数字10.