Bu maqola murakkab mavzuni qamrab oladi, maâlum edge-caselarni yaxshiroq tushunish uchun.
Bu muhim emas. Koâplab tajribali dasturchilar buni bilmasdan ham yaxshi yashaydi. Agar narsalar parda ortida qanday ishlashini bilishni istasangiz, oâqishda davom eting.
Dinamik baholanadigan metod chaqiruvi this ni yoâqotishi mumkin.
Masalan:
let user = {
name: "John",
hi() { alert(this.name); },
bye() { alert("Xayr"); }
};
user.hi(); // ishlaydi
// endi nomga qarab user.hi yoki user.bye ni chaqiramiz
(user.name == "John" ? user.hi : user.bye)(); // Xato!
Oxirgi qatorda user.hi yoki user.bye ni tanlaydigan shartli operator bor. Bu holda natija user.hi dir.
Keyin metod darhol qavs () bilan chaqiriladi. Lekin u toâgâri ishlamaydi!
Koârib turganingizdek, chaqiruv xatoga olib keladi, chunki chaqiruv ichida "this" ning qiymati undefined boâladi.
Bu ishlaydi (objekt nuqta metod):
user.hi();
Bu ishlamaydi (baholangan metod):
(user.name == "John" ? user.hi : user.bye)(); // Xato!
Nima uchun? Agar biz nima uchun shunday boâlishini tushunmoqchi boâlsak, obj.method() chaqiruvi qanday ishlashining parda ortiga qaraylik.
Reference type tushuntirilishi
Diqqat bilan qarasak, obj.method() ifodasida ikkita amal borligini koâramiz:
- Birinchidan, nuqta
'.'obj.methodxususiyatini oladi. - Keyin qavs
()uni bajaradi.
Xoâsh, this haqidagi maâlumot birinchi qismdan ikkinchisiga qanday oâtkaziladi?
Agar bu amallarni alohida qatorlarga qoâysak, this albatta yoâqoladi:
let user = {
name: "John",
hi() { alert(this.name); }
}
// metodni olish va chaqirishni ikki qatorga ajratish
let hi = user.hi;
hi(); // Xato, chunki this undefined
Bu yerda hi = user.hi funktsiyani oâzgaruvchiga joylashtiradi va keyin oxirgi qatorda u butunlay mustaqil boâladi va shuning uchun this yoâq.
user.hi() chaqiruvlari ishlashi uchun JavaScript hiyla ishlatadi â nuqta '.' funktsiya emas, balki maxsus Reference Type qiymatini qaytaradi.
Reference Type "spetsifikatsiya turi"dir. Biz uni aniq ishlatib boâlmaydi, lekin u til tomonidan ichki ishlatiladi.
Reference Type qiymati uch qiymatli kombinatsiya (base, name, strict) dir, bu yerda:
baseâ objekt.nameâ xususiyat nomi.strictâ agaruse strictkuchda boâlsa true.
user.hi xususiyatiga kirish natijasi funktsiya emas, balki Reference Type qiymati. Qatâiy rejimda user.hi uchun bu:
// Reference Type qiymati
(user, "hi", true)
Reference Type da qavs () chaqirilganda, ular objekt va uning metodi haqidagi toâliq maâlumotni oladi va toâgâri this ni oârnatishi mumkin (bu holda =user).
Reference type nuqta . dan chaqiruv qavslari () ga maâlumot uzatish maqsadida maxsus âvositachiâ ichki tur.
hi = user.hi kabi har qanday boshqa amal reference type ni butunlay bekor qiladi, user.hi qiymatini (funktsiya) oladi va uni uzatadi. Shuning uchun har qanday keyingi amal this ni âyoâqotadiâ.
Shunday qilib, natijada this qiymati faqat funktsiya toâgâridan-toâgâri nuqta obj.method() yoki kvadrat qavs obj['method']() sintaksisi yordamida chaqirilgandagina toâgâri yoâl bilan uzatiladi (ular bu yerda bir xil). Bu muammoni hal qilishning turli usullari bor, masalan func.bind().
Xulosa
Reference Type â tilning ichki turi.
Xususiyatni oâqish, masalan obj.method() dagi nuqta . bilan, aynan xususiyat qiymatini emas, balki xususiyat qiymati va u olingan objektni saqlaydigan maxsus âreference typeâ qiymatini qaytaradi.
Bu keyingi metod chaqiruvi () objektni olishi va unga this ni oârnatishi uchun.
Barcha boshqa amallar uchun reference type avtomatik ravishda xususiyat qiymatiga aylanadi (bizning holatda funktsiya).
Butun mexanizm bizning koâzlarimizdan yashirin. Bu faqat nozik hollarda muhim, masalan metod objekt ifoda yordamida dinamik ravishda olinganda.
Izohlar
<code>yorlig'ini ishlating, bir nechta satrlar uchun - ularni<pre>yorlig'i bilan o'rab qo'ying, 10 satrdan ortiq bo'lsa - sandbox (plnkr, jsbin, codepenâ¦)