原文參考(medium.freecodecamp.org/a-guide-to-…)javascript
this
關鍵詞是Javascript中最廣爲使用的而且使人誤解的詞。今天我將嘗試改變它。java
當學習代詞時,讓咱們回到古老的學校時代。web
菲爾普斯遊得很快,由於他想贏得比賽。bash
注意代詞he
的使用。咱們在這不直接稱呼菲爾普斯可是用代詞he
指代菲爾普斯。相似地,JavaScript使用this
關鍵字做爲指示對象來引用上下文中的對象,即主題。app
例如:ide
在上面的代碼中,咱們有一個對象car
,它有make
,model
和fullName
屬性。 fullName
的值是一個function
,它能夠用兩種不一樣的語法打印car
的全稱函數
使用this => this.make+」 「 +this.model
,這個this
指向上下文中的對象,因此this.make
其實是car.make
,而且this.model
也是如此學習
使用點表示法,咱們能夠訪問對象的屬性car.make
和car.model
。
ui
this
!如今咱們已經理解了this
是什麼,這只是最基礎的用法,讓咱們來作一些規則以至於咱們能夠記住。this
JS中的this
關鍵詞指向它所屬的對象。
var car={
make:'....'
func:()=>{
console.log(this.make)
}
}
複製代碼
上面代碼片斷中的this
屬於對象car
依賴於用法,它有不一樣的值
call()
和apply()
當this
在一個方法裏使用,它指向方法全部者對象。
在一個對象中的定義的函數被叫作方法。讓咱們再舉一次car
的例子。
var car= {
make: "Lamborghini",
model: "Huracán",
fullName: function () {
console.log(this.make+" " +this.model);
console.log(car.make+ " " +car.model);
}
}
car.fullName();
複製代碼
fullName()
在這裏是一個方法。在這個方法裏的this
屬於car
在一個函數裏,this
有一點複雜。首先要理解的是,與全部對象都具備屬性同樣,函數也具備屬性。不管函數什麼時候執行,它都能獲取this
屬性,該屬性是一個變量,其中包含調用它的對象的值。
若是函數沒有被對象調用,那麼函數內部的this
屬於全局對象,稱之爲窗口。在這個案例裏,this
將引用全局做用域中定義的值。讓咱們看一個更好理解的例子:
var make= "Mclaren";
var model= "720s"
function fullName(){
console.log(this.make+ " " + this.model);
}
var car = {
make:"Lamborghini",
model:"Huracán",
fullName:function () {
console.log (this.make + " " + this.model);
}
}
car.fullName(); // Lmborghini Huracán
window.fullName(); // Mclaren 720S
fullName(); // Mclaren 720S
複製代碼
這裏make
,model
和fullName
是全局定義的,而car
對象也有fullName
的實現。當car
對象被調用時,這指的是在對象內定義的屬性。另外一方面,其餘兩個函數調用是相同的並返回全局定義的屬性。
當單獨使用而不是在任何函數或對象內部時,this
指的是全局對象。
var make = 'Mclaren';
var model = '720s'
var name = 'Ferrari';
console.log(this.name); //Ferrari
複製代碼
這裏的this
指的是全局名稱屬性。
事件能夠是任何類型,但爲了簡單和清晰起見,讓咱們進行點擊事件。
只要單擊一個按鈕並引起一個事件,它就能夠調用另外一個函數來根據點擊執行某個任務。若是this
在函數內部使用,它將引用引起事件的元素。在DOM中,全部元素都存儲爲對象。這就是爲何當引起一個事件時它會引用該元素,由於該webpage
元素其實是DOM中的一個對象。
好比:
<button onclick="this.style.display='none'">
Remove Me!
</button>
複製代碼
call()
、apply()
& bind()
this
的值。