js中的this指向问题
this的指向在函數定義的時候是確定不了的,只有函數執行的時候才能確定,this最終指向調用它的對象。
1.函數調用模式
當一個函數并非一個對象的屬性時,那么它就是被當做函數來調用的。在此種模式下,this被綁定為全局對象,在瀏覽器環境下就是window對象
2.方法調用模式
當函數被保存為一個對象的屬性時,它就可稱為這個對象的方法。當一個方法被調用時,this被綁定到這個對象上。如果調用表達式包含一個提取屬性的動作(. 或 []),那么它被稱為方法調用
這里的this指向的對象是o,因為調用這個sayName()函數是通過o.sayName()執行的。
因為是o.b調用的這個函數,所以指向b這個對象
同理,因為是o.b調用的這個函數,所以指向b這個對象
?
t是全局變量,在全局環境下執行,this指向window
3.構造函數調用模式
如果在一個函數前面加上new關鍵字來調用,那么就會創建一個連接到該函數的prototype成員的新對象,同時,this會被綁定到這個新對象上。這種情況下,這個函數就可以成為此對象的構造函數。
在構造函數,new出一個對象時,this指向這個構造函數,new關鍵字會改變this的指向
當用new關鍵字,返回的是一個對象,this指向的就是那個返回的對象;
如果返回的不是對象,this還是指向函數的實例,雖然null屬于對象,但是返回null依然指向函數實例
4.apply和call調用模式
JS中,函數也是對象,所有函數對象都有兩個方法:apply和call,這兩個方法可以讓我們構建一個參數數組傳遞給調用函數,也允許我們改變this的值
在全局范圍內,this指向全局對象(瀏覽器下指window對象)
對象函數調用時,this指向當前對象
全局函數調用時,應該是指向調用全局函數的對象。
使用new關鍵字實例化對象時,this指向新創建的對象
當用apply和call上下文調用的時候指向傳入的第一個參數
練習題
在執行person1.sayName()時,時方法調用模式,this代表person1這個對象
在執行person2.sayName()時,時方法調用,但是sayName,并沒有執行,而是將sayName()這個函數賦值給fun這個變量,fun是函數調用模式,this指向window,故輸出全局的name
執行console.log(b.n)時,b對象有自己的屬性n值
執行console.log(c.n)時,c對象沒有自己的屬性n值,會向上查找,找的A對象中的屬性n值
vargetColor=test.getColor相當于把方法函數賦值給全局變量,
故getColor()中的this指向window
test.getColor()是方法調用總結
以上是生活随笔為你收集整理的js中的this指向问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 指数分布具有“无记忆性”
- 下一篇: 数据分析大厂面试真题汇总