闭包
个人理解就是把内部函数、变量什么的暴露出去,使在外部可访问。闭包至少有两个函数,一个外部函数,一个内部函数
红皮书中关于闭包讲的很详细,看过了在这里做个记录:
- 闭包与变量
闭包只能取得包含函数中任何变量的最后一个值,因为闭包所保存的是整个变量,而不是某个特殊变量
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的问题看了很久,也看了很多次,这里结合闭包说一下
注意:在全局函数中,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和arguments时,只会搜索到活动对象为止,因此这里永远不能打印出hello,可以把代码做这样的修改
getNameFunc:function(){
var _this=this
return function(){
return _this.name
}
}
这样就能当问到hello,_this是我们在包含函数中特意声明的一个变量,所以闭包也可以访问
注:用es6的箭头函数也可以解决这个问题
- 是否会造成内存泄漏?
所谓的内存泄漏,是指IE9之前的版本对JScript对象和COM对象使用不同的垃圾收集历程,所以闭包在IE的这些版本中可能导致一些特殊的问题,这是可以解决的。
比如闭包的作用域中保存html元素时,以为这钙元素将无法被销毁,这时,可以把该对象的副本,加入是element.id保存在变量中,然后闭包结束时,把element=null置为空
谨记:闭包会应用包含函数的整个活动对象
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。