神奇的this

有一點很重要,this是個變色龍,它指向誰是不定的,也不是在函數定義的時候確定的

栗子1:

<pre name="code" class="html">function a(){
    var user = "追夢子";
    console.log(this.user); //undefined
    console.log(this); //Window
}
a();
window.a();




栗子中的函數a 是window的一個屬性,alert也是,this是指向調用它的對象的,函數a被window調用,故第二個輸出爲Window,而Window中沒有user這個屬性,故爲undefined.

栗子2:

var o = {
    a:10,
    b:{
        a:12,
        fn:function(){
            console.log(this.a); //12
        }
    }
}
o.b.fn();

還有個中重要的情況:this指向的是執行它的主體,而不是賦值的主體。

var o = {
    a:10,
    b:{
        a:12,
        fn:function(){
            console.log(this.a); //undefined
            console.log(this); //window
        }
    }
}
var j = o.b.fn;
j();
如果一個函數中有this,這個函數中包含多個對象,儘管這個函數是被最外層的對象所調用,this指向的也只是它上一級的對象
在構造函數中,如果返回值是一個對象,那麼this指向的就是那個返回的對象,如果返回值不是一個對象那麼this還是指向函數的實例

function fn(){
    this.num = 1;
}
var a = new fn();
console.log(a.num); //1
首先new關鍵字會創建一個空的對象,然後會自動調用一個函數apply方法,將this指向這個空對象,這樣的話函數內部的this就會被這個空的對象替代。

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