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指向——上下文,
- 對象中沒有上下文,對象裏面沒有爸爸。
- 普通函數找養父,箭頭函數找生父