關於this的指向,確實是一個使人頭疼的問題,那麼this到底指向誰呢?數組
歸根到底一句話:誰調用了包含this的方法,那麼this就指向誰bash
關於這點,咳咳咳...有以下三個觀點:app
1.this指向的,永遠只多是對象!函數
2.this指向誰,永遠不取決於this寫在哪!而是取決於函數在哪調用。ui
3.this指向的對象,咱們稱之爲函數的上下文context,也叫函數的調用者。this
以下:spa
function Test(){ } Test() 複製代碼
此時,this就指向windowcode
以下:對象
let Test = { name:"Fan", say:function(){ console.log(this.name) } } Test.say() //Fan 複製代碼
此時,this就指向Test作用域
不過,匿名函數(好比:定時器)具備全局性,所以this對象一般也指向window
以下:
function Test(){ console.log(this); } let arr = [Test,1,2]; arr[0](); 複製代碼
此時,this就指向arr
以下:
function Test(){ console.log(this); } setTimeout(Test,1000); // setInterval(Test,1000); 複製代碼
此時,this就指向window
以下:
function Test(){ console.log(this); } let obj = new Test(); 複製代碼
此時,this就指向obj
若是使用 call、apply、bind綁定對象,那麼this就指向那個綁定的對象
箭頭函數
箭頭函數比較特殊,由於箭頭函數內部沒有this,this指向外層最近的調用者,簡單的說,就是須要向上找一級
- 箭頭函數在調用時,不會生成自身做用域下的this和arguments
- 不像普通函數同樣在調用時自動獲取this,而是沿着做用域鏈向上查找,找到最近的外部一層做用域的this,並獲取
- 在定義對象的方法/具備動態上下文的回調函數/構造函數中都不適用