美文网首页
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