Qo'shimcha mavzular

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:

ref-muammo.js
// natija shu yerda chiqadi

Xuddi shunday, chaqiruvni murakkabroq ifodaga o'rasak ham this yo'qolishi mumkin:

ref-murakkab.js
// natija shu yerda chiqadi

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:

Ya'ni user.salom mantiqan quyidagicha:

// (base, name, strict) uchligi
(user, "salom", true)
Reference Type โ€” bu tilning ichki, oraliq turi. Uni to'g'ridan-to'g'ri o'zgaruvchiga saqlab bo'lmaydi; u faqat nuqta amali natijasi sifatida qisqa vaqt yashaydi.

Chaqiruv qanday ishlaydi?

() chaqiruv operatori o'zidan oldingi qiymatni ko'radi:

Endi hamma narsa tushunarli:

Reference Type faqat nuqta yoki kvadrat qavsdan bevosita keyin chaqiruv qilinganda saqlanadi: 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:

ref-yechim.js
// natija shu yerda chiqadi
Metodni callback sifatida uzatayotganda (masalan setTimeout(user.salom)) doim thisni bind qiling yoki () => user.salom() deb o'rang.

Xulosa