Skip to content

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:

js
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

js
const add = (function () {
  let counter = 0
  return function () {
    counter += 1
    return counter
  }
})()

add() // 1
add() // 2
add() // 3

Bu yerda nima sodir bo'ldi?

  • Tashqi (IIFE) funksiya bir marta ishlaydi va counter o'zgaruvchisini nolga tenglaydi.
  • U ichki funksiyani qaytaradi.
  • Ichki funksiya tashqi funksiyadagi counter o'zgaruvchisiga kirish huquqini "eslab qoladi" ( closure hosil qiladi).
  • Endi biz add() ni chaqirganimizda, u o'sha saqlanib qolgan counter ni 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.