書接上文,網上不少博客都寫到這樣一個問題:如果this遇到return時究竟會指向誰?
網上的博客是這樣給出答案的:
2.如果返回值是一個對象,那麼this指向的就是那個返回的對象,如果返回值不是一個對象那麼this還是指向函數的實例。
我在實驗的時候發現了這樣一個問題
function user(){
this.a = 1;
this.b = 2;
return {x:12};
}
var a = new user();
console.log(a);
這時候的控制檯輸出應該爲 {x: 12};
但是如果我想知道this究竟指向的是誰,於是我加了一條語句
function user(){
this.a = 1;
this.b = 2;
console.log(this);
return {x:12};
}
var a = new user();
這時候控制檯輸出的是 user {a: 1, b: 2};不對啊,爲什麼this沒有指向返回的對象??這和說好的不一樣,this指向的究竟是什麼東西? 經過多次試驗後終於發現了正確答案:
本文剛開頭說的第一條結論正確,第二條結論並不準確;
在user中,代碼是從上往下執行的,this一開始一直都是指向的函數的事例,這時候的a還是 user {a: 1, b: 2};並沒有指向什麼返回的對象,所以我們console.log(this),控制檯輸出的結果是 user {a: 1, b: 2};
當代碼執行到return語句後,函數返回一個對象,這時候函數的實例(也就是a)就進行了更新,也就是第一條結論:return的是Object。這種情況下,不再返回this對象,而是返回return語句的返回值。a就變爲了{x:12}。
爲了再次驗證第二條結論並不準確,我們來看看這樣一個例子:
function user(){
this.a = 1;
this.b = 2;
return {key:this}
}
var a = new user();
console.log(a);
這時控制檯的輸出結果如下:
this並沒有指向所謂的返回的對象,依舊是我們的 user {a: 1, b: 2};
博客上寫的東西並不一定是對的,什麼例子都要親自去多次試驗,我們在看博客時要時刻抱着懷疑的態度去學習。