美文网首页
JavaScript的this详解

JavaScript的this详解

作者: kim_jin | 来源:发表于2018-09-11 11:06 被阅读0次

    this的指向主要分为以下四种:

    作为对象的方法调用
    作为普通函数调用
    作为构造器进行调用
    Function.prototype.call或是Function.prototype.apply进行调用
    作为对象的方法进行调用
    当函数作为对象的方法被调用的时候,this指向该对象。

    var obj = {
      a : 1,
      getA : function (){
        alert( this === obj)  //true
        alert(this.a) // 1
      }
    }
    

    最为普通函数调用
    当函数并不作为对象的属性被调用的时候,就是我们常说的普通函数的调用,这个时候this总是指向全局的。

    window.name = 'globalName';
    var getName = function (){
      return this.name; 
    }
    console.log(getName()); //globalName
    
    //另外一种写法
    var  myOwnObject ={
      name :'kim',
      getMyName : function(){
        return this.name;
      }
    };
    var getName = myOwnObject.getMyName ;
    console.log(getName()); //globalName
    

    在这种情况下,有的时候我们想要获取并不是全局的this,我们采取的措施是现将这个this进行存储,在下面进行调用就好。
    构造器调用
    JavaScript没有类的概念,但是可以从构造器中创建对象,同时也提供了new的运算符,让我呢吧的构造器看起来更像一个类。当运用new运算符调用函数的时候呀,该函数会返回一个对象,在一般的情况下构造器里面的this会指向这个返回的对象。

    var MyClass = function(){
      this.name = 'kim';
    };
    var obj = new MyClass();
    alert(obi.name); // kim
    

    但是如果我们的构造器显示的返回了一个Object类型的对象,那么此次运算结果最终就会返回这个对象,我们之前期待的this不会出现了。

    var MyClass = function(){
      this.name = 'kim';
      return{
        name:'lala'
      }
    };
    var obj = new MyClass();
    alert(obi.name); // lala
    

    但是如果构造器不显式的返回任何数据,或者是返回一个非对象数据类型的数据,不会造成上面的问题。比如说返回一个String类型的数据,就不会改变上述的问题。
    Function.prototype.call或是Function.prototype.apply进行调用
    Function.prototype.call或是Function.prototype.apply进行调用可以动态的改变传入函数的this

    var obj1 ={
      name: 'kim',
      getName: function(){
        return this.name;
      }
    };
    var obj2 ={
      name : 'lalal'
    };
    console.log(obj1.getName());  //kim
    console.log(obj1.getName.call(obj2));  //lala
    

    this丢失

    var obj1 ={
      name: 'kim',
      getName: function(){
        return this.name;
      }
    };
    console.log(obj.getName()); //kim
    var getName2 = obj.getName;
    console.log(obj1.getName2()); //undefined
    

    今日一讲:当调用obj.getName时,其中getName方法是作为obj对象的属性被调用的,所以this指向的是obj对象,当用另外一个变量getName2来引用obj.getName,并且调用getName2,这是一个普通函数的调用,this指向的是全局。

    相关文章

      网友评论

          本文标题:JavaScript的this详解

          本文链接:https://www.haomeiwen.com/subject/ijlfwftx.html