我的理解就是把内部函数、变量什么的暴露出去,使在外部可访问。闭包至少有两个函数,一个外部函数,一个内部函数
红皮书中关于闭包讲的很详细,看过了在这里作个记录:html
闭包只能取得包含函数中任何变量的最后一个值,由于闭包所保存的是整个变量,而不是某个特殊变量es6
function creatFunctions(){ var result=new Array() for(var i=0;i<10;i++){ result[i]=function(){ return i } } return result; }
这段代码返回的每一个值是10,而不是看起来的1,2,3........,再看下面的代码:数组
function creatFunctions(){ var result=new Array() for(var i=0;i<10;i++){ result[i]=function(num){ return function(){ return num } }(i) } return result; }
发现不一样了么,第二段代码中不是把闭包赋值给数组,而是定义一个匿名函数,传入参数,并当即执行。由于函数参数是按值传递,这样就能够遍历出1,2,3........闭包
this的问题看了好久,也看了不少次,这里结合闭包说一下
注意:在全局函数中,this等于window,当函数被当作某个对象的方法调用时,this等于那个对象函数
var name="The Window" var object={ name:"hello", getNameFunc:function(){ return function(){ return this.name } } } alert(object.getNameFunc()())
在调用object.getNameFunc()()时,是两个括号,此时弹出的是The Window,猜猜为何?
若是去掉括号,变成alert(object.getNameFunc())此时弹出的是this
对,就是把里面的内容打印出来了,并无调用。内部函数在搜索this和arguments时,只会搜索到活动对象为止,所以这里永远不能打印出hello,能够把代码作这样的修改spa
getNameFunc:function(){ var _this=this return function(){ return _this.name } }
这样就能当问到hello,_this是咱们在包含函数中特地声明的一个变量,因此闭包也能够访问
注:用es6的箭头函数也能够解决这个问题code
所谓的内存泄漏,是指IE9以前的版本对JScript对象和COM对象使用不一样的垃圾收集历程,因此闭包在IE的这些版本中可能致使一些特殊的问题,这是能够解决的。
好比闭包的做用域中保存html元素时,觉得这钙元素将没法被销毁,这时,能够把该对象的副本,加入是element.id保存在变量中,而后闭包结束时,把element=null置为空htm
谨记:闭包会应用包含函数的整个活动对象对象