• 闭包与this对象


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

  • 相关阅读:
    WinForm窗体传值 总结
    SQLServer遍历数据库所有表及统计表数据总数
    GridView合并行代码
    日期转换成字符串
    flex与js交互浅析
    九,query task
    八,graphics
    十,Find and Identity
    转移批令
    db dw dd 和 dup
  • 原文地址:https://www.cnblogs.com/shn1637/p/3456606.html
Copyright © 2020-2023  润新知