Javascript作为脚本语言,与其他语言类似,是有一个作用域的概念存在的,但作为执行脚本,其最大的特点就是具有一个全局作用域,且子作用域可以拿到父作用域的句柄,但这同样也影响了JavaScript的独立性与内聚性,而闭包恰能很好的解决该问题。
闭包,通俗的描述一下 就是,当函数运行结束后,可以不让其中的局部变量被垃圾回收处理掉,外部程序拿到了持有内部变量句柄的函数后后,仍然可以进一步对其进行操作。
例:
function outerFun (){
var innerPara = 0;
var innerFun = function(){
innerPara++;
return innerPara;
}
return innerFun;
}
当调用outerFun()函数获得了innerFun函数对象后,内部函数依然可以对属于outerFun的局部变量innerPara进行操作,并且每次的操作结果 并不会 被垃圾回收清空,而 会一直保留上一次 的 操作结果。
第一次调用 返回1,第二次调用返回 2,第三次调用返回3
以计数功能为例:
<button id="button1">
<button id="button2">
<button id="button3">
想通过计数器来存储按钮被点击了多少次。
如果使用全局变量,程序会像下面
var count1=0;
var count2=0;
var count3=0;
$(button1).click(function(){
count1++;
});
$(button2).click(function(){
count2++;
});
$(button3).click(function(){
count3++;
});
但 如上的处理,会将按钮1,按钮2,按钮3的点击计数引用,暴露给全局。
使用闭包可以写成如下:
$(button1).click((function(){
var count1 = 0;
return function(){
count1++;
}
})());
$(button2).click((function(){
var count2 = 0;
return function(){
count2++;
}
})());
$(button3).click((function(){
var count3 = 0;
return function(){
count3++;
}
})());