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"
  
每个函数一旦被调用,它将自动获得thisarguments两个变量。
一个内部函数是不能直接从外部函数访问到这两个变量的。可以通过将
this对象存储在另一个变量中来解决这个问题。如:

     
varname="The Window";
     
varobject={
        
name:"My Object",
        
getNameFunc:function()
        
{
           
varthat=this;   //将 this存储在that中
            returnfunction()
           
{
              
returnthat.name;   //通过that访问name
            };
        
}
     
};
     
alert(object.getNameFunc()());   //"My Object"

  
要让闭包访问外部函数的thisarguments对象,可以通过将它
们的引用存储在另一个变量中来完成。

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;
     
}