javascript中的this

    在剛接觸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了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章