關於this在普通函數與箭頭函數的指向問題——普通函數找養父,箭頭函數找生父

1. 首先了解兩種函數綁定this的時間:

	普通函數:this在函數調用時綁定。找養父
	箭頭函數:this在函數聲明時綁定。找生父

普通函數中的this變化:

function cA(){
	console.log(this)    //window 此時cA是掛載到window調用的,所以指向window)
	function cAA(){
		console.log(this) //window 此時cAA雖然在cA裏面,在其後執行,但是也是在掛載到window調用的。
	}
	cAA()
}
cA()

new創建的新對象在執行的時候是掛載到新對象下執行的。所以this指向是該新對象。

function cA(){
	console.log(this)    //cA{ }    此時因爲是用new創建的新對象,所以指向是cc,而cc=cA{ })
	function cAA(){
		console.log(this) //window  此時cAA雖然在cA裏面,在其後執行,但是也是掛載到window調用的。
	}
	cAA()
}
var cc= new cA()
let cC= {
	cCC:function(){
		console.log(this)      //{cCC:f }   此時因爲普通函數是對象cC的一個屬性值,所以執行的時候是在該對象下執行的,所以this的指向是該對象。
	}
}
cC.cCC();

箭頭函數的this指向

箭頭函數據說其根本沒有this的,它的this是從上下文中繼承的,也就是說從他親爸爸那裏得來的

var aA=()=>{console.log(this)}
aA()//此時的上下文是window,所以this指向是window
var aA={
	aAA:()=>{console.log(this)}  //此時也是指向window。哈哈,因爲對象內部沒有上下文,該箭頭函數是對象的一個屬性值,也就是對象他自己。所以他的爸爸是window。
}
aA.aAA()
function aA(){
	aAA=()=>{
		console.log(this)//aa=aA()  此時aAA的親爸爸是aA,而aA的this因爲new的緣故已經由window轉變爲了aa。所以箭頭函數的上下文是aa。
	}
	aAA()
}
var aa = new aA()

總結:

  • new創建對象會改變函數的this指向。
  • 普通函數在執行的時候找this指向
  • 箭頭函數在聲明的時候找this指向——上下文,
  • 對象中沒有上下文,對象裏面沒有爸爸。
  • 普通函數找養父,箭頭函數找生父
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章