JS中 this 到底指向誰?

JS中的 this 到底指向誰?

關於this的指向,確實是一個使人頭疼的問題,那麼this到底指向誰呢?數組

歸根到底一句話:誰調用了包含this的方法,那麼this就指向誰bash

關於這點,咳咳咳...有以下三個觀點:app

1.this指向的,永遠只多是對象!函數

2.this指向誰,永遠不取決於this寫在哪!而是取決於函數在哪調用。ui

3.this指向的對象,咱們稱之爲函數的上下文context,也叫函數的調用者。this

  • 在全局中,經過函數名直接調用,this就指向window

以下:spa

function Test(){

}
Test()
複製代碼

此時,this就指向windowcode

  • 經過對象.函數名()調用的:this就指向這個對象

以下:對象

let Test = {
	name:"Fan",
	say:function(){
		console.log(this.name)
	}
}
Test.say()	//Fan
複製代碼

此時,this就指向Test作用域

不過,匿名函數(好比:定時器)具備全局性,所以this對象一般也指向window

  • 函數做爲數組的一個元素,經過數組下標調用的,this指向這個數組

以下:

function Test(){
	console.log(this);
}

let arr = [Test,1,2];
arr[0]();
複製代碼

此時,this就指向arr

  • 函數做爲window內置函數的回調函數調用時,this就指向window,好比:setInterval setTimeout 等)

以下:

function Test(){
	console.log(this);
}

setTimeout(Test,1000);
// setInterval(Test,1000);
複製代碼

此時,this就指向window

  • 函數做爲構造函數,用new關鍵字調用時,this指向新new出的對象

以下:

function Test(){
	console.log(this);
}

let obj = new Test();
複製代碼

此時,this就指向obj

  • 若是使用 call、apply、bind綁定對象,那麼this就指向那個綁定的對象

  • 箭頭函數

箭頭函數比較特殊,由於箭頭函數內部沒有this,this指向外層最近的調用者,簡單的說,就是須要向上找一級

  • 箭頭函數在調用時,不會生成自身做用域下的this和arguments
  • 不像普通函數同樣在調用時自動獲取this,而是沿着做用域鏈向上查找,找到最近的外部一層做用域的this,並獲取
  • 在定義對象的方法/具備動態上下文的回調函數/構造函數中都不適用

^_<

相關文章
相關標籤/搜索