定义
闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。。(百度百科)
通俗的说:JavaScript中所有的function都是一个闭包
案例解读
基本案例
function foo() {
var i = 0;
return function() {
return ++i;
}
}
var bar=foo();
这里的foo运行后返回了一个函数,这个函数拥有一个自己私有的变量i,这个变量i不会因为foo运行结束了就被销毁。
返回的这个函数被赋值给bar,这个bar就是一个闭包,它的特征是拥有自己的私有成员,该例子中私有成员是变量i,这个私有成员可以是一个函数
带有循环的闭包
function foo() {
var result = [];
for (var i = 0; i < 10; i++) {
result[i] = function(){return i};
}
return result;
}
var bar = foo();
现象如上,原因是循环生成了10个闭包,但是,他们的私有成员
i
是他们共有的,当最后一个闭包函数生成后,i
的值已经等于10,而前面的闭包的i
都是这个i
循环生成闭包并且拥有真正的自己
i
function foo() {
var result = [];
for (var i = 0; i < 10; i++) {
result[i] = (function(i) {
return function() {
return i
}
})(i);仔细对比这里的区别
}
return result;
}
var bar = foo();
显然,循环生成的每个闭包都真正拥有的自己私有变量,解决办法是代码中的自执行函数包裹需要生成的闭包函数,并为闭包函数提供一个独立的变量,这个时候它们的
i
是来自包裹它们的自执行函数的参数,而不是刚才的foo里面的那个i
,所以它们各是各的
总结
闭包的用途在我看来是为函数提供私有的变量,使得数据安全,不会污染别人的变量,别人的成员,别人的老婆。
每个家庭就好比一个闭包函数,不同的家庭有不同的老婆、老公、孩子,他们的名字甚至也可以是一样的,然后每个家庭是独立的。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。