Funksiya yopilishlari (Closures)
JavaScript-da Closure (yopilish) — bu funksiya va u e'lon qilingan muhitdir (lexical environment). Closure ichki funksiyaga tashqi funksiya scope-idagi (o'zgaruvchilariga) kirish huquqini beradi.
Shaxsiy o'zgaruvchilar muammosi
Tasavvur qiling, sizga biror narsani sanaydigan hisoblagich (counter) kerak. Agar siz global o'zgaruvchi ishlatsangiz, uni istalgan kod o'zgartirib yuborishi mumkin:
let counter = 0
function add() {
counter += 1
}
add()
add()
counter = 100 // Bu global o'zgaruvchini buzib yuboradi!Agar o'zgaruvchini funksiya ichiga olsak, u har safar nolga tenglanib qoladi.
Closure yordamida yechim
Closure bizga o'zgaruvchini shaxsiy (private) saqlash va faqat belgilangan funksiya orqali o'zgartirish imkonini beradi.
Misol
const add = (function () {
let counter = 0
return function () {
counter += 1
return counter
}
})()
add() // 1
add() // 2
add() // 3Bu yerda nima sodir bo'ldi?
- Tashqi (IIFE) funksiya bir marta ishlaydi va
countero'zgaruvchisini nolga tenglaydi. - U ichki funksiyani qaytaradi.
- Ichki funksiya tashqi funksiyadagi
countero'zgaruvchisiga kirish huquqini "eslab qoladi" ( closure hosil qiladi). - Endi biz
add()ni chaqirganimizda, u o'sha saqlanib qolgancounterni o'zgartiradi.
Nima uchun Closure kerak?
- Ma'lumotlarni yashirish (Data Privacy): O'zgaruvchilarni tashqaridan to'g'ridan-to'g'ri o'zgartirishni taqiqlash uchun.
- Funksiya fabrikalari: Muayyan mantiq bilan ishlovchi yangi funksiyalar yaratish uchun.
Muhim
JavaScript-da deyarli barcha funksiyalar closure (yopilish) hisoblanadi, chunki ular hech bo'lmaganda global scope-ga kirish huquqiga ega. Lekin "closure" atamasi odatda ichki funksiya tashqi funksiya o'zgaruvchilarini eslab qolganda ishlatiladi.
