闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(一般是一个函数),于是这些变量也是该表达式的一部分。。(百度百科)安全
通俗的说:JavaScript中全部的function都是一个闭包闭包
基本案例函数
function foo() { var i = 0; return function() { return ++i; } } var bar=foo();
这里的foo运行后返回了一个函数,这个函数拥有一个本身私有的变量i,这个变量i不会由于foo运行结束了就被销毁。
返回的这个函数被赋值给bar,这个bar就是一个闭包,它的特征是拥有本身的私有成员,该例子中私有成员是变量i,这个私有成员能够是一个函数spa
带有循环的闭包3d
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
code
循环生成闭包而且拥有真正的本身i
blog
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
,因此它们各是各的图片
闭包的用途在我看来是为函数提供私有的变量,使得数据安全,不会污染别人的变量,别人的成员,别人的老婆。ip
每一个家庭就比如一个闭包函数,不一样的家庭有不一样的老婆、老公、孩子,他们的名字甚至也能够是同样的,而后每一个家庭是独立的。it