在剛接觸javascript時,總會被this繞暈,網上的大部分this教程都說得比較抽象,看了很多,自己總結了一點心得。
首先this指向的是一個對象,它只能在函數的內部使用。this指向誰在定義的時候是不知道的,只有在調用的時候纔會知道。
接下來我舉點例子,看懂了這些例子,理解this就很簡單了。
一、
function xxx(){
var a = 1;
console.log(this.a);//undefined
console.log(this);//控制檯輸出window對象
}
xxx();
這裏就會有問題了,爲什麼this.a是undefined,爲什麼不是1呢?
接下來我們再看一個函數。
function xxx(){ var a = 1; console.log(this.a);//undefined console.log(this);//控制檯輸出window對象 } window.xxx();
這兩個函數在控制檯輸出的結果應該是一樣的,這能說明什麼問題呢?
你用xxx( )等同於使用了window.xxx( ),我們知道全局函數是window對象的方法,這裏this指向的是window對象,然而這裏的a是xxx( )函數裏面的局部變量,window.a的結果當然是undefined;
所以調用全局函數,this指向的是全局對象window,指向的是調用this所在方法的對象。
二、
接下來我們看下一個例子
var uao = { a:1, hs:function(){ console.log(this.a);//輸出1 console.log(this);//輸出對象uao } } uao.hs();
我們可以發現這裏的this指向的是uao這個對象,而不是window,接下來我們再看一個函數,
var uao = {
a:1,
hs:function(){
console.log(this.a);//輸出1
console.log(this);//輸出對象uao
}
}
window.uao.hs();
發現結果與上一次一樣,爲什麼this沒有指向window呢?因爲hs這個函數是被上一級的uao這個對象所調用的,所以this指向的是上一級的對象。
三、
爲了驗證以上結論,我們再來做個實驗var uao = {
a:1,
b:{
a:2,
hs:function(){
console.log(this.a); //輸出2
console.log(this);//輸出對象b
}
}
}
uao.b.hs();
我們現在發現this指向的確實是上一級對象b,結論成立;但是
var uao = {
a:1,
b:{
a:2,
hs:function(){
console.log(this.a); //輸出undefined
console.log(this);//輸出對象window
}
}
}
var sonic = uao.b.hs;
sonic();
如果用函數別名的話,我們發現結果又和第一個例子一樣了,其實不難理解,這裏其實就是相當於window.sonic( ),所以關鍵點就是在調用上,uao.b.fn並沒有執行,然後就直接賦值給了sonic,然後sonic進行調用,this指向了sonic的上一級對象window,沒毛病。
四、
在構造函數中,this指向又會有點不一樣function xxx(){
var a = 1;
console.log(this.a);//undefined
console.log(this);//控制檯輸出uao對象
}
var uao = new xxx();
這裏的this指向的是新創建的uao這個對象,new改變了this的指向,就我個人拙見,可以簡單粗暴的理解爲是uao這個對象調用了this,this指向他上一級的對象,也就是uao了。