在實際應用中,this的指向大體能夠分爲如下四種。函數
# 做爲對象的方法調用this
# 做爲普通函數調用時spa
# 構造器調用。對象
1.做爲對象的方法調用,this指向該對象get
當函數做爲對象的方法被調用時,this指向該對象;io
例子: console
var obj={function
a:1,方法
getA:function(){數據
alert(this===obj);//輸出 :true; this 指向obj
alert(this.a);//輸出1;
}
}
obj.getA();
當 函數(getA) 做爲對象(obj)的方法被調用時,this指向該對象;
2.做爲普通函數調用時,this的指向;
當函數不做爲對象的屬性被調用時,也就是咱們一般所說的普通函數方式,此時的this老是指向全局對象。
例子:
window.name='globalName';
var getName=function(){
return this.name;//這裏的this指向的 window(全局對象)
}
console.log(getName())//輸出‘globalName’
或者:
window.name='globalName';
var myObject={
name:'sven',
getName:function(){
return this.name;
}
}
var getName=myObject.getName;
myObject.getName()//輸出sven
console.log(getName());//輸出globalName
3.構造器調用。
構造器的外表跟普通函數如出一轍,他們的區別在於被調用的方式,當用new運算符調用函數時,該函數總會返回一個對象,一般狀況下,構造器裏的this就指向返回的這個對象:
var MyClass = function(){
this.name='sven';
}
var obj = new MyClass();
alert(obj.name)//輸出sven
這裏須要注意的是:若是構造器返回了一個Object類型的對象,那麼,這次的運算結果最終會返回這個對象,而不是咱們以前期待的this
var MyClass = function(){
this.name='sven';
return {
name:'anne' //返回的是一個對象: {name:'anne'}
}
}
var obj = new MyClass();
alert(obj.name)//輸出anne
若是構造器不顯示地返回任何數據,或者是一個非對象類型的數據,就不會形成上訴問題