Funksiyalar bilan chuqur ishlash

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:

strelka-this.js
// natija shu yerda chiqadi

Agar bu yerda talaba => ... o'rniga oddiy function(talaba) { ... } yozilganida, ichki funksiyada this undefined bo'lib, this.sarlavha xatolik bergan bo'lardi.

Strelkada 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:

strelka-bind-yoq.js
// natija shu yerda chiqadi
Aynan shu sabab strelka funksiyalari React, hodisa ishlovchilari va 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:

strelka-arguments.js
// natija shu yerda chiqadi

Zamonaviy kodda ko'pincha arguments o'rniga rest parametri (...args) ishlatiladi. Lekin strelkaning argumentsni tashqaridan olishi ba'zi holatlarda foydali qoladi.

Agar strelka ichida 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:

Aslida bu "kamchiliklar" emas โ€” strelka ataylab shunday tarhlangan. U kontekstga ega bo'lmagan, qisqa funksiya sifatida ishlash uchun mo'ljallangan. "O'z konteksti yo'qligi" uning eng katta kuchli tomoni.

Qachon foydali?

strelka-callback.js
// natija shu yerda chiqadi
Qachon strelkani ISHLATMASLIK kerak? โ€” Obyekt metodini o'zi 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