zoukankan      html  css  js  c++  java
  • *关于Js中this值得注意的一个地方

    Function.prototype.bind = function(pObject)
    {
     assert.notNull(pObject, "not object to bind function");
     
     var __method = this;
     var result =  function methodBinder()
     {
      var methodRet = __method.apply(pObject, arguments);
      return methodRet;
     };
     result._bindedFunc = this;
     return(result);
    };

    为Function原型对象添加bind方法,这个方法是在下面这个情况下使用
    function JSClass()
      {
          this.m_Text = 'division element';
          this.m_Element = document.createElement('DIV');
          this.m_Element.innerHTML = this.m_Text;
            
          this.m_Element.attachEvent('onclick', this.ToString);//这里很关键,应该是this.ToString.bind(this)
      }
       
      JSClass.prototype.Render = function()
      {
          document.body.appendChild(this.m_Element);
      }     

      JSClass.prototype.ToString = function()
      {
          alert(this.m_Text);
      };

      var jc = new JSClass();
      jc.Render(); 
      jc.ToString();

    值得注意的是:
    1、在attachEvent后,触发事件执行的时候 alert(this.m_Text);这个this是在Event发生的时候,指向的是Window对象(应该是JS里面这样规定好的,在js装载的时候,就已经为所有的变量(除了this)分配好了作用域,this在不同的执行环境所指代的都不同)
    2、除非我们在触发时间执行的时候能够找到这个方法真正所属于的那个对象,再把this替换过来就可以了;
    3、在Function.prototype.bind 中,关键点是pObject这个传入的参数,在js加载的时候,应该是已经把apply(pObject, arguments);中的pObject建立了作用域,就是把pObject指向在bind的时候传入的那个对象,所以在真正触发调用的时候,解释执行var methodRet = __method.apply(pObject, arguments);
    的时候可以找到pObject是当时bind那个对象;
    4、其实看上去就是利用闭包函数奇怪的作用域这个特点:
  • 相关阅读:
    1. 初探--prometheus调研
    Spring boot采坑记--- 在启动时RequstMappingHandlerMapping无法找到部分contorller类文件的解决方案
    Servlet——映射细节、3.0注解配置、线程不安全问题
    Servlet——概述、实现方式、生命周期、ServletConfig类
    HTTP——概述、请求和响应、GET和POST请求
    Tomcat——简介、目录结构等
    XML解析——Dom4j解析器
    XML解析——Jsoup解析器
    XML解析——Jaxp解析器
    XML——简介、语法、约束、解析
  • 原文地址:https://www.cnblogs.com/dwjaissk/p/719915.html
Copyright © 2011-2022 走看看