zoukankan      html  css  js  c++  java
  • 闭包与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;
         
    }

  • 相关阅读:
    单机部署redis主从备份
    【 D3.js 进阶系列 — 2.1 】 力学图的事件 + 顶点的固定
    java生成二维码(带logo)
    求一个序列的全部排列
    【C/C++学院】(24)Oracle数据库编程--管理oracle
    php学习之道:mysql SELECT FOUND_ROWS()与COUNT(*)使用方法差别
    用"池"来提升对象的复用
    迷茫的一代人
    VMWARE安装MAC时无法移动鼠标?
    小心两个共享库共用同一个静态库
  • 原文地址:https://www.cnblogs.com/shn1637/p/3456606.html
Copyright © 2011-2022 走看看