this anahtar sözcüğü
Aynı etiket işlevi bir kez kupanın adını söyleyebilir, sonra nesneyi kaçırabilir, ardından fincanın adını gösterebilir. Küme parantezleri yerinde kaldı. Değişen çağrıdır. JavaScript this değerini çağrı anında seçer, işlevi yazarken değil.
Düz yöntem çağrısından sonra
Yöntemler sayfası işlevi nesnenin üzerine koydu ve product.tag() ile çalıştırdı. O biçimde this, noktanın önündeki nesneydi. Sayfa orada durdu. Burada işlev durur, çağrı değişir: nesneden ayrılır, call ile hedeflenir, bind ile kilitlenir ya da ok olarak yazılır.
Çağrının this değerini belirlediği beş biçim
📊 Yöntem, çıplak, call, bind, ok
| Biçim | Örnek | this nereye oturur |
|---|---|---|
| yöntem | product.tag() |
noktanın önündeki nesne |
| çıplak | let show = product.tag; show() |
o nesne değil (katı kipte undefined) |
| call | product.tag.call(cup) |
call içine verdiğiniz nesne, yalnızca bu çalıştırma için |
| bind | product.tag.bind(product) |
sonraki çağrılarda o nesneye kilitli |
| ok | başka bir işlevin içinde () => this.name |
dış işlevin this değeri, noktanın önündeki nesne değil |
this okumadan önce çağrının adını koyun. İşlevi nesnenin üzerine bırakmak this değerini dondurmaz. Kararı çağrı verir. bind sonraki bir çağrı için kararı önceden verir. Ok, çağrıyı yok sayar ve kendisini saran işleve bakar.
"use strict";
let product = {
name: "Mug",
tag() {
return this.name;
}
};
console.log(product.tag());
Nokta hâlâ nesnenin adını söyler
product.tag() işlev tag değerini çalıştırır ve this değerini product üzerine koyar. Konsol Mug yazar. Bu, yöntemler sayfasındaki kuraldır; burada taban çizgisi olarak durur. Sonraki dört çağrı bu çizgiden bilerek ayrılır.
"use strict";
let product = {
name: "Mug",
tag() {
if (this == null) {
return "missing";
}
return this.name;
}
};
let show = product.tag;
console.log(show());
İşlevi nesneden kaldırınca kupa noktayla birlikte gider
show ile product.tag aynı işlevdir. show() çağrısında noktanın önünde nesne yoktur; katı kipte this bu yüzden undefined olur. Nöbetçi missing döndürür. Nöbetçiyi kaldırırsanız this.name hata fırlatır. Bu sayfa sonucu öngörülebilir tutmak için katı kipte kalır. Gevşek bir betik çıplak çağrıyı genel nesneye yöneltebilir.
"use strict";
let product = {
name: "Mug",
tag() {
return this.name;
}
};
let cup = { name: "Cup" };
console.log(product.tag.call(cup));
call işlevi tek bir nesne için ödünç verir
product.tag.call(cup) hâlâ kupanın tag işlevini çalıştırır, ama bu turda this değeri cup olur. Konsol Cup yazar. product.name değeri Mug kalır. call işlevi cup üzerine yapıştırmaz. apply, fazladan argümanlar bir dizideyken aynı işi görür — bu etiketin onlara ihtiyacı yok.
"use strict";
let product = {
name: "Mug",
tag() {
return this.name;
}
};
let show = product.tag.bind(product);
console.log(show());
bind nesneyi sonraki çıplak çağrı için saklar
bind yeni bir işlev döndürür. İçinde this, show() noktasız olsa bile product kalır. Konsol Mug yazar. Özgün tag değişmez. Bir düğme, zamanlayıcı ya da başka bir işlev yöntemi önde nesne olmadan çağıracaksa bind kullanın.
"use strict";
let shelf = {
name: "Shelf",
make() {
let product = {
name: "Mug",
tag: () => this.name
};
return product.tag();
}
};
console.log(shelf.make());
Ok, this değerini noktadan almaz
product.tag() yöntem çağrısı gibi durur, ama tag bir oktur. Okun kendi this değeri yoktur. this değerini make içinden alır; make ise shelf.make() olarak çalıştığı için this değeri shelf olur. Konsol Mug değil Shelf yazar. product üzerinde sıradan bir yöntem olsaydı Mug yazardı. Oklar daha önceki bir sayfada geldi; bu sayfa yalnızca this üzerindeki etkilerini gösterir.
Çağrıyı işe uydurun
Nesne noktanın önünde mi? this değerini o nesne olarak okuyun. İşlevi kaldırdınız ve kilitlemediniz mi? Nesneyi beklemeyin. Başka bir nesne, tek tur mu? call kullanın. Noktasız sonraki çağrı yine kupayı görmeli mi? Önce bind. Ok mu yazdınız? Dışarı, onu saran işleve bakın; noktanın önündeki nesneye değil. Kurucu ve sınıf da this ayarlar; onlar daha sonraki bir sayfaya kalır. Sıradaki JSON: veriyi anlatan metin, this için yeni bir kural değil.
Kilitli etiketi sayfaya koyun
tag değerini bind ile kupaya kilitleyin, sonra yeni işlevi noktasız çağırın. Sonucu bir paragrafa yazın.
<!DOCTYPE html>
<html>
<head>
<title>this-keyword — page</title>
</head>
<body>
<p id="line">…</p>
<script>
"use strict";
let product = {
name: "Mug",
tag() {
return this.name;
}
};
let show = product.tag.bind(product);
let box = document.getElementById("line");
box.textContent = show();
</script>
</body>
</html>
Paragraf Mug gösterir. show() çağrısında noktanın önünde nesne yoktur; satır yine de kupanın adını söyler çünkü bind this değerini kilitlemiştir. Yalnızca product.name değerini değiştirin, sayfayı yenileyin, paragraf onu izler. Sonraki ders: JavaScript’te JSON — veriyi anlatan metin, this için yeni bir kural değil.
Alıştırma adımları
product.tag()çağırın veMugokuyun.- İşlevi
showiçine koyun, katı kipteshow()çağırın vemissingokuyun. product.tag.call(cup)çağırın veCupokuyun.tagdeğeriniproductüzerine kilitleyin, yeni işlevi noktasız çağırın veMugokuyun.shelf.make()çalıştırın veMugdeğilShelfokuyun.- HTML demosunda yalnızca
product.namedeğerini değiştirin, yenileyin ve paragrafı okuyun.
Sık kaymalar
- İşlev nesnenin üzerinde duruyor diye
thisdonmuş sanmak - Katı kipte
show()çağırıp hâlâMugbeklemek callişlevinintagdeğerinicupüzerine kopyaladığını düşünmekbindözgüntagdeğerini yeniden yazar sanmak; yeni işlev döndürür- Yöntemin yerine ok yazıp noktanın önündeki nesneyi beklemek
- Sonraki sayfayı başka bir
thiskuralı sanmak — JSON veri için bir metin biçimidir
Özet
thisdeğerini çağrı seçer, küme parantezleri değilobject.method()thisdeğerini noktanın önündeki nesneye koyar- Katı kipte çıplak çağrı
thisdeğerini o nesneye yöneltmez call,thisdeğerini verdiğiniz nesneye koyar, yalnızca o tur içinbind,thisdeğeri kilitli kalan bir işlev döndürür- Ok,
thisdeğerini saran işlevden alır - Kilitli bir çağrı sayfada bir satırı doldurabilir
- Sıradaki: JSON, veriyi anlatan metin
🧠 Bilginizi Test Edin
Bilginizi Test Edin
Bu interaktif sınavla kendini test et ve konuyu ne kadar iyi anladığını gör
📝 Talimatlar
- Her soruyu dikkatle okuyun
- Her soru için en iyi cevabı seçin
- Quiz'i istediğiniz kadar tekrar alabilirsiniz
- İlerlemeniz üstte gösterilecek