参考:MDN 闭包
什么是闭包:
首先闭包是一个函数,但是不是普通的函数,该函数能够读取其他函数的局部变量。或者说闭包是两者的结合体:闭包是函数和声明该函数的词法环境的组合。
比如:
function makeFunc() {
var name = "Mozilla";
//一个函数
function displayName() {
alert(name); //该函数的“父函数”的局部变量
}
return displayName; //将函数displayName和父函数的局部变量作为一个整体返回给调用者,即返回了一个闭包
}
var myFunc = makeFunc();
myFunc();//执行函数,页面弹窗alert弹窗
闭包的使用
例如:模拟私有函数:
var Counter = (function() {
var privateCounter = 0;
function changeBy(val) {
privateCounter += val;
}
return {
increment: function() {
changeBy(1);
},
decrement: function() {
changeBy(-1);
},
value: function() {
return privateCounter;
}
}
})();
console.log(Counter.value()); /* logs 0 */
Counter.increment();
Counter.increment();
console.log(Counter.value()); /* logs 2 */
Counter.decrement();
console.log(Counter.value()); /* logs 1 */
闭包的优势
- 可以形成函数实例的私有空间,提供了管理命名空间的能力,避免变量冲突
- 实现不同函数(闭包)实例的运行环境的隔离
- 代码书写上比java中的声明内部类更加简明
闭包使用中的注意事项
如果不是某些特定任务需要使用闭包,在其它函数中创建函数是不明智的,因为闭包在处理速度和内存消耗方面对脚本性能具有负面影响。
例如,在创建新的对象或者类时,方法通常应该关联于对象的原型,而不是定义到对象的构造器中。原因是这将导致每次构造器被调用时,方法都会被重新赋值一次(也就是,每个对象的创建)。