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、其实看上去就是利用闭包函数奇怪的作用域这个特点:
  • 相关阅读:
    python 学习笔记 数值型(1)
    python 学习笔记 标识符和变量(3)
    python 学习笔记 字符串(2)
    jsp+servlet+javaBean+Dao
    面试被问到岗时间,是越快越好吗?
    有赞多平台推广接入与测试
    HTTPS 加密、证书、签名与握手
    开发到底要不要自己做测试?
    我也曾找不到工作
    世界第三大浏览器正在消亡
  • 原文地址:https://www.cnblogs.com/dwjaissk/p/719915.html
Copyright © 2011-2022 走看看