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、其实看上去就是利用闭包函数奇怪的作用域这个特点:
  • 相关阅读:
    进行C# 编写发送邮箱,报错Error: need EHLO and AUTH first !
    vue使jsZip和FileSaver.js打包下载
    基于js或vue项目实现一次批量文件下载功能
    模块
    now 与 down 中的 ow 发音是否一样?
    __time64_t 解决了 2038 年问题,可是没解决 1969年问题
    MagickSetOption(mw, "jpeg:extent", "...kb"); 这个函数有时结果出乎意料
    解决Idea启动Spring Boot很慢的问题
    CAP原理和BASE思想和ACID模型
    java并发编程之Condition
  • 原文地址:https://www.cnblogs.com/dwjaissk/p/719915.html
Copyright © 2011-2022 走看看