摘自MDN:https://developer.mozilla.org...
闭包是函数和申明该函数的词法环境的组合,这个环境包含了这个闭包创建时所能访问到的所有局部变量
function makeFunc() {
var name = "Mozilla";
function displayName() {
alert(name);
}
return displayName;
}
var myFunc = makeFunc();
myFunc(); //alert("Mozilla")
在上面的例子中,调用myFun函数能正常执行,是因为在displayName函数中形成了闭包,包含了创建diaplayName函数时能访问到的局部变量name。
另一个更有意思的例子
function makeAdder(x) {
return function(y) {
return x + y;
};}
var add5 = makeAdder(5);
var add10 = makeAdder(10);
console.log(add5(2)); // 7
console.log(add10(2)); // 12
以上例子中add5和add10都是闭包,它们共享了相同的函数定义,但保存了不同的词法环境。
闭包允许将函数和其操作的某些数据(环境)关联起来。
1. 对只有一个方法的对象可以使用闭包
2. 可以用闭包模拟私有方法:私有方法不仅能限制对代码的访问,还提供了管理全局命名空间的能力,避免非核心的方法弄乱代码的公共接口部分
下面这个例子使用闭包定义公共函数,并令其可以访问私有函数和变量,这个方式也称为模块模式:
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 */
该共享环境建立于一个立即执行的匿名函数体内。这个环境中包含两个私有项:privateCounter变量和changeBy函数,这两项都无法在匿名函数外直接访问,必须通过返回的三个公共函数进行访问。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。