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、其实看上去就是利用闭包函数奇怪的作用域这个特点:
  • 相关阅读:
    国家语言,语言代码,locale id对应表
    SpringMVC,SpringBoot文件下载
    lombok使用基础教程
    博客园主题修改中用到的css属性
    Hexo next博客添加折叠块功能添加折叠代码块
    IntelIj IDEA运行JUnit Test OutOfMemoryError
    Spring Boot-JPA、Hibernate、Spring data jpa之间的关系
    IntelliJ IDEA-设置字体大小
    win10-mysql卸载干净
    IntelliJ IDEA Check out from git
  • 原文地址:https://www.cnblogs.com/dwjaissk/p/719915.html
Copyright © 2011-2022 走看看