• 正确理解javascript的this关键字


        javascript有this关键字,它和javascript的执行上下文有着密切的关系,就是说this具体指代什么要根据它的上下文来判断。

    一、this和对象的关系   

    var Person={
              name:"xie yue",
              gender:"female",
              getName:function(){
                      alert(Person.name);
             }
    };
    Person.getName();

    上面的代码中,我们定义了一个Person对象,对象中包含了name,gender属性和getName方法,其作用是弹出Person对象的name属性。在这种情况下我们使用this关键字代替Person对象本身,所以上面的代码就等于:

    var Person={
              name:"xie yue",
              gender:"female",
              getName:function(){
                      alert(this.name);
             }
    };
    Person.getName();

    PS:this永远指向的是函数对象的所有者,上面例子中getName的所有者是Person对象,所以this指向的是Person对象。

    二、this和全局对象

    我们再来看看在全局对象中,this指代的是什么,我们知道javascript是脚本语言,所以javascript的执行需要一个宿主环境,在浏览器中这个宿主就是window对象,所以在全局函数中this指代的是window对象(除非使用了new、apply、call方法来改变this的指代关系)。

    var a=2;
    alert(a);//2
    alert(this.a);//2
    alert(window.a);//2

    我们经常在函数名字前面加上window来调用函数,这是因为在浏览器中的全局对象就是window,所有的函数变量都在window对象之中。比如:

    var a=2;
    function foo(){
       var b=3;
       return(this.a+b);//这里的this指代window,返回3
    }
    foo();

    所以记住:this永远指向函数对象的所有者,即this的值是由激活执行上下文代码的调用者决定的,就好理解this的指代关系了。

    三、构造函数中的this

    当函数作为构造器使用new实例化时,this的指代关系又是怎么样的呢?看下面的代码:

    var Person=function(){
      this.name="xiyue";
    }
    var person = new Person();
    alert(person.name);

     这个执行过程可以分成3步:

    1、首先建立一个空对象object,如var obj={};

    2、然后将空对象使用Person的call操作,类似Person.call(obj);

    3、执行完Person后再return this,完成new过程,赋值给person变量。

    所以经过new加工过函数,this的函数调用者是Person本身而不是window对象了。

    四、嵌套函数中的this

    在嵌套函数中,this的指代对象又会是怎么样呢?看下面的代码:

    var myObj={
      fun1:function(){
        alert(this);//object
        var fun2=function(){
          alert(this);//window
          var fun3=function(){
            alert(this);//window
          }()
        }()
      }
    };
    myObj.fun1();

    由于嵌套函数的执行上下文是window,所以this指代的是window对象。

    五、事件处理中的this

    在javascript中处理事件函数中,this指代的关系就更加扑朔迷离了,我们建立一个showValue的函数,函数内容如下:

    var showValue=function(){
      alert(this.value);
    }

     现在有个input标签,我们给input标签添加一个click事件,当点击click事件是触发showValue函数,看看现在的this指代的是什么?

    <input id="test" type="text" />

    通过dom.onclick绑定事件:document.getElementById("test").onclick=showValue;这里的showValue虽然定义在全局对象中,但是采用了onclick的绑定方式时,showValue是作为dom的onclick方法被调用的,所以this指代的是dom对象而不再是window对象啦!

    六、当事件写在html标签内

    <input id="test" type="text" onclick="showValue();" />

    当点击dom时,我们获取不到正确的this。因为此时的this指代的是window对象,因为window对象没有定义value的值,所以会弹出undefined,因为没有获取到value的值,其实此时不是将showValue函数赋值给dom对象的onclick,而是引用!所以上面的代码与下面的代码是一样的。

    document.getElementById("test").onclick=function(){
        showValue();
    }

    根据上面所说的javascript中的嵌套函数this其实是指代的window对象,所以showValue的this其实就是window对象。

    七、通过addEventListener和attachEvent绑定事件监听

    <input type="text" id="test" />
    <script>
    var dom = document.getElementById("test");
    id="window";
    function test(){
       alert(this.id);
    }
    dom.addEventListener?dom.addEventListener("click",test,false):dom.attachEvent("onclick",test);
    </script>

     这种绑定事件的监听方式,addEventListener中的this指代的dom对象,而attachEvent中的this指代的则是window对象(**星星**);

    八、使用apply和call改变this的指向

    在Function对象原型中(Function.prototype)有两个方法:call和apply,通过call和apply可以改变this的值,它们都接受第一个参数作为调用执行上下文中this的值,它们的不同点是:从第二个参数开始,apply接收参数为数组,而call接收的参数则是依次传入的。

    var obj={
          name:"xiyue",
          gender:"female"
    };
    var getInfo=function(){
       return{"name"+this.name,"gender"+this.gender};
    }
    getInfo.call(obj);

     当没有getInfo.call(obj)时,getInfo中的this指代的是window对象,但是有了getInfo.call(obj)代码时,函数的执行环境就不一样了,因为此时函数体内的this对象指向了obj啦,所以就会返回obj中的属性。
    总结:this是javascript中的重要关键字,只有掌握了this在不同的执行上下文所指代的关系,才能避免一些不必要的错误。

  • 相关阅读:
    道砟说明
    方案设计图
    红外对摄报价
    荣昌县公安局监控设计方案
    安盈楼宇对讲系统
    高速公路方案一
    高速公路方案一
    无线智能报警暨家电控制
    百安居监控设计方案
    家庭防盗报警系统
  • 原文地址:https://www.cnblogs.com/ILYljhl/p/3224115.html
Copyright © 2020-2023  润新知