This理解

一般來講,this指向的是那個對象,在函數的建立過程當中是沒法肯定的,只有在執行時才能肯定。誰調用它就指向誰(其實網上不少文章都是這麼說的),下面看例子:app

例子1:函數

var a={
    b:1,
    c:function(){
        b:2;
        console.log(this.b);
    }
}
a.c();//1

函數c是由a對象調用,因此函數c內的this指向的a對象,而a.b=10,因此最終結果是1而不是2this

例子2code

var a=1;
function b(){
    var a=2;
    console.log(this.a)
}
b();//1

也許有些同窗會比較疑惑,window對象是一個全局對象,其實b函數是由window對象調用執行的(window.b()),隨意b函數內的this指向的是window對象

例子3io

var a={
    b:1,
c:{
    b:2,
d:function(){
    b:3;
    console.log(this.b)
}
}
}
a.c.d()//2

有多個嵌套對象或函數,雖然這個函數是被最外面的對象所調用,可是this指向的也只是它上一級的對象console

例子4(比較特殊的例子)function

var a={
    b:1,
c:{
    b:2,
d:function(){
    b:3;
    console.log(this.b)
}
}
}
 var e=a.c.d
e();//undefined

雖然把d函數賦值個e,也就是e=d,可是沒有執行,最後執行的時候是有window調用的,因此結果是undefined構造函數

例子5(構造函數內的this)方法

function a(x){
        this.x=x;
    }
    var b=new a(3);
    console.log(b.x)//3

這裏之因此輸出3,是由於new改變了this的指向,將this指向函數的實例b. 爲何this會指向b?首先new關鍵字會建立一個空的對象,而後會自動調用一個函數apply方法,將this指向這個空對象,這樣的話函數內部的this就會被這個空的對象替代。

例子6(函數內有return)

function a(){
    this.x="張三";
    return {};
}
var b=new a();
console.log(b.x)//undefined

再看一個

function a(){
    this.x="張三";
    return function(){};
}
var b=new a();
console.log(b.x)//undefined

再看一個

function a(){
    this.x="張三";
    return 1;
}
var b=new a();
console.log(b.x)//張三
function a(){
    this.x="張三";
    return undefined;
}
var b=new a();
console.log(b.x)//張三

若是返回值是一個對象,那麼this指向的就是那個返回的對象,若是返回值不是一個對象那麼this仍是指向函數的實例

還有一點補充下

function a(){
    this.x="張三";
    return null;
}
var b=new a();
console.log(b.x)//張三

雖然null也是對象,可是在這裏this仍是指向函數a的實例b,由於null比較特殊

相關文章
相關標籤/搜索