javascript中return後this指向問題

    書接上文,網上不少博客都寫到這樣一個問題:如果this遇到return時究竟會指向誰?

    網上的博客是這樣給出答案的:

        1.return的是Object。這種情況下,不再返回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};

   博客上寫的東西並不一定是對的,什麼例子都要親自去多次試驗,我們在看博客時要時刻抱着懷疑的態度去學習。

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