JS指this指向問題

2021-09-27 04:28:27 字數 2307 閱讀 8742

最近出去面試,筆試題總是會有關於this,指向的問題。但每次回答都不太理想,遂去網上看了一些部落格,整理了一些分享給大家。

this的指向在函式定義的時候是確定不了的,只有函式執行的時候才能確定,this最終指向呼叫它的物件。

1.函式呼叫模式

當乙個函式並非乙個物件的屬性時,那麼它就是被當做函式來呼叫的。在此種模式下,this被繫結為全域性物件,在瀏覽器環境下就是window物件。

2.方法呼叫模式

當函式被儲存為乙個物件的屬性時,它就可稱為這個物件的方法。當乙個方法被呼叫時,this被繫結到這個物件上。如果呼叫表示式包含乙個提取屬性的動作(. 或 ),那麼它被稱為方法呼叫

這裡的this指向的物件是o,因為呼叫這個sayname()函式是通過o.sayname()執行的。

因為是o.b呼叫的這個函式,所以指向b這個物件

t是全域性變數,在全域性環境下執行,this指向window

3.構造函式呼叫模式

如果在乙個函式前面加上new關鍵字來呼叫,那麼就會建立乙個連線到該函式的prototype成員的新物件,同時,this會被繫結到這個新物件上。這種情況下,這個函式就可以成為此物件的建構函式。

在建構函式,new出乙個物件時,this指向這個建構函式,new關鍵字會改變this的指向。(這個例子中a是全域性變數,應該this指向windows才是,但是new改變了this指向) 

當用new關鍵字,返回的是乙個物件,this指向的就是那個返回的物件;(本例子中new fn函式返回的是this.name="hello",是個物件形式的,所以this指向了name)

如果返回的不是物件,this還是指向函式的例項,雖然null屬於物件,但是返回null依然指向函式例項

es5新增function.prototype.bind方法接受乙個物件引數,返回乙個與function相同但this指向傳入的引數物件的新函式。

這個返回的新函式無論在什麼情況下被呼叫this始終指向bind方法第乙個引數物件。

function.prototype.bind不會改變原函式的this指向。

function func1()

var func2 = func1.bind();

console.log(func2()); // 1

var obj = ;

console.log(obj.func1(), obj.func2()); // 2, 1

原文: 

6.箭頭函式中的this

由於箭頭函式不繫結this, 它會捕獲其所在(即定義的位置)上下文的this值, 作為自己的this值,

考慮到 this 是詞法層面上的,嚴格模式中與 this 相關的規則都將被忽略。(可以忽略是否在嚴格模式下的影響)

作為方法的箭頭函式this指向全域性window物件,而普通函式則指向呼叫它的物件

詳情請看:

總結:在全域性範圍內,this指向全域性物件(瀏覽器下指window物件)

物件函式呼叫時,this指向當前物件

全域性函式呼叫時,應該是指向呼叫全域性函式的物件。

使用new關鍵字例項化物件時,this指向新建立的物件

JS中this指向問題

解析器在呼叫函式時,每次都會向函式內部傳遞進乙個隱含的引數,這個隱含的引數就是this,this指向的是乙個物件,這個物件我們稱之為函式執行的上下文物件,根據函式的呼叫方式不同,this會指向不同的物件.簡單來說一下函式中this指向問題,1.this是什麼?任何函式本質上都是通過某個物件來呼叫的,...

js常見this指向問題

關於this的總結 全域性環境 和 普通函式中this指的是是windows console.log this windows function abc abc 事件中的this是被偵聽的物件 document document.addeventlistener click clickhander ...

JS中this指向問題

函式內部的this之和函式的呼叫方式有關,和函式的定義方式沒有關係functionfn fn windowvar obj obj.fn obj functionfn 或者可以這樣寫自呼叫函式 functionfn div document.queryselector div div.onclick ...