Reference Type
Ba'zan metod chaqiruvi kutilmaganda thisni yo'qotadi. Buning sababi โ JavaScript ichida yashiringan Reference Type ("ma'lumotnoma turi") deb ataluvchi maxsus qiymat turi. Uni tushunsak, chalkash holatlar aniq bo'ladi.
Muammo: yo'qolgan this
Quyidagi kodda oddiy chaqiruv ishlaydi, lekin metodni oldin ajratib, keyin chaqirsak โ this yo'qoladi:
Xuddi shunday, chaqiruvni murakkabroq ifodaga o'rasak ham this yo'qolishi mumkin:
Nuqta amali nima qaytaradi?
Sir shundaki, user.salom ifodasi oddiy funksiyani emas, balki maxsus Reference Type qiymatini qaytaradi. Bu til ichidagi qiymat bo'lib, uch narsani birlashtiradi:
baseโ obyektning o'zi (user);nameโ xususiyat nomi ("salom");strictโ qat'iy rejim yoqilganmi (bayroq).
Ya'ni user.salom mantiqan quyidagicha:
// (base, name, strict) uchligi
(user, "salom", true)
Chaqiruv qanday ishlaydi?
() chaqiruv operatori o'zidan oldingi qiymatni ko'radi:
- Agar bu Reference Type bo'lsa โ
()uningbaseinithisqilib oladi. Shu sababuser.salom()dathis = user; - Agar bu oddiy funksiya bo'lsa (Reference Type emas) โ
this = undefined(qat'iy rejimda).
Endi hamma narsa tushunarli:
user.salom()โuser.salomReference Type qaytaradi,()undanbaseni oladi.this = user;let f = user.salom; f()โ o'zgaruvchiga yozishda Reference Type yo'qoladi, faqat funksiyaning o'zi ko'chadi.this = undefined;(user.salom || null)()โ||operatori Reference Typeni oddiy funksiyaga aylantiradi.this = undefined.
obj.method() yoki obj["method"](). Har qanday oraliq amal (o'zgaruvchiga yozish, ||, qavsda saqlash) uni yo'qotadi.Yechim: this'ni qotirish
Agar metodni ajratib olib, alohida uzatishimiz kerak bo'lsa, thisni bind orqali qotiramiz yoki o'q funksiyaga o'raymiz:
setTimeout(user.salom)) doim thisni bind qiling yoki () => user.salom() deb o'rang.Xulosa
obj.methodifodasi oddiy funksiya emas, ichki Reference Type qiymatini qaytaradi;- Reference Type
base,namevastrictni birlashtiradi; ()chaqiruvi Reference Typedanbaseni olib,thisqiladi;- O'zgaruvchiga yozish,
||, qavs kabi oraliq amallar Reference Typeni yo'qotadi ->thisyo'qoladi; - Yechim:
bindyoki o'q funksiya bilan o'rash.