2.闭包与this对象
在闭包内使用this对象将产生一些复杂的行为。this对象的值
基于函数所在的执行环境在运行时决定:在全局函数中使用时,this
等于window(非严格模式)或undefined(严格模式);而当作为对象
的方法调用时,this等于这个对象。如:
varname="The Window";
varobject={
name:"My Object",
getNameFunc:function()
{
returnfunction()
{
returnthis.name;
};
}
};
alert(object.getNameFunc()()); //"The Window" -- 非严格模式下
在上面的代码中,最后一行执行的结果并不是我们所期望的"My Object",
而是"The Window"。
每个函数一旦被调用,它将自动获得this和arguments两个变量。
一个内部函数是不能直接从外部函数访问到这两个变量的。可以通过将
this对象存储在另一个变量中来解决这个问题。如:
varname="The Window";
varobject={
name:"My Object",
getNameFunc:function()
{
varthat=this; //将 this存储在that中
returnfunction()
{
returnthat.name; //通过that访问name
};
}
};
alert(object.getNameFunc()()); //"My Object"
要让闭包访问外部函数的this和arguments对象,可以通过将它
们的引用存储在另一个变量中来完成。
3.内存泄露
在IE9之前的IE浏览器中,通过闭包访问HTML元素会导致元素不能
被垃圾回收器销毁。如:
functionassignHandler()
{
varelement=document.getElementById("someElement");
element.onclick=function()
{
alert(element.id);
};
}
上面的代码产生一个闭包,匿名函数保持对element变量的引用,
使其占用的内存不能被释放。可通过下面的方法来解决这个问题:
functionassignHandler()
{
varelement=document.getElementById("someElement");
varid=element.id;
element.onclick=function()
{
alert(id);
};
element=null;
}