Strelka funksiyalari (qayta ko'rib chiqish)
Strelka funksiyalari (=>) shunchaki "funksiya yozishning qisqa usuli" emas. Ularning o'ziga xos, muhim xususiyatlari bor. Ushbu darsda ularni chuqur qayta ko'rib chiqamiz.
Strelkada o'z this yo'q
Eng muhim xususiyat: strelka funksiyasining o'z thisi yo'q. Uning ichida this ishlatilsa, u tashqi (o'rab turuvchi) funksiyaning thisini oladi.
Bu obyekt metodi ichida ichki funksiya yozganda juda foydali. Oddiy funksiyada this yo'qolardi, strelkada esa saqlanadi:
Agar bu yerda talaba => ... o'rniga oddiy function(talaba) { ... } yozilganida, ichki funksiyada this undefined bo'lib, this.sarlavha xatolik bergan bo'lardi.
this "yo'q" degani โ u umuman aniqlanmaydi va JavaScript uni tashqi muhitdan qidiradi (xuddi oddiy o'zgaruvchan kabi). Shuning uchun strelka "tashqi thisni oladi" deb aytiladi.bind/call/apply strelkaga ta'sir qilmaydi
Strelkaning o'z thisi bo'lmagani uchun, unga call, apply yoki bind orqali this berib bo'lmaydi โ ular e'tiborsiz qoldiriladi:
setTimeout ichida qulay โ ular thisni ataylab "o'rab turgan" komponentga bog'lab qoldiradi va tasodifan yo'qolmaydi.Strelkada arguments yo'q
Strelka funksiyalarning o'z arguments obyekti ham yo'q. Bu dekoratorlarda tashqi funksiyaning argumentlariga murojaat qilishda foydali:
Zamonaviy kodda ko'pincha arguments o'rniga rest parametri (...args) ishlatiladi. Lekin strelkaning argumentsni tashqaridan olishi ba'zi holatlarda foydali qoladi.
argumentsni ishlatsangiz, u tashqi oddiy funksiyaning argumentsiga ishora qiladi. Agar tashqarida hech qanday oddiy funksiya bo'lmasa, xatolik yuzaga keladi.Strelka new bilan ishlamaydi
Strelka funksiyalarni konstruktor sifatida ishlatib bo'lmaydi โ ular o'z thisiga ega emasligi bilan bevosita bog'liq. new bilan chaqirsak, xatolik chiqadi:
let Foydalanuvchi = (ism) => {
this.ism = ism;
};
// let u = new Foydalanuvchi("Ali");
// TypeError: Foydalanuvchi is not a constructor
Obyekt yaratuvchi konstruktor kerak bo'lsa โ oddiy funksiya yoki class ishlatiladi, strelka emas.
Boshqa yo'q xususiyatlar
Strelka funksiyalarda quyidagilar ham yo'q:
- O'z
thisi โ tashqaridan olinadi; argumentsobyekti โ tashqaridan olinadi;superโ sinf metodlarida tashqaridan olinadi;- Konstruktor sifatida ishlash (
newishlamaydi); prototypexossasi โ strelkada yo'q.
Qachon foydali?
- Qisqa callbacklar:
arr.map(x => x * 2),arr.filter(x => x > 0); - Metod ichidagi ichki funksiyalar โ tashqi
thisni saqlab qolish uchun; setTimeout, hodisa ishlovchilaridathisni bog'lab qoldirish uchun.
this orqali obyektga murojaat qilishi kerak bo'lsa. Bunda oddiy metod sintaksisi (korsat() {}) to'g'ri, chunki strelkada this obyektga emas, global muhitga ishora qilib qoladi.Xulosa
- Strelkaning o'z
thisi yo'q โ u tashqi funksiyadan olinadi; call/apply/bindstrelkaningthisini o'zgartirmaydi;- Strelkada
argumentsyo'q โ tashqi funksiyadan olinadi; - Strelkani
newbilan ishlatib bo'lmaydi (u konstruktor emas); - Strelka qisqa callback'lar va tashqi
thisni saqlash uchun ideal; - Obyektning asosiy metodlari uchun strelka o'rniga oddiy metod sintaksisidan foydalaning.