一般來講,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比較特殊