JavaScript'da yopilishlar (closures) nima?

MiddleJavaScript #javascript #closures

Savol

JavaScript'da closure nima va u qanday ishlaydi?

Qisqa javob

Closure — bu tashqi funksiya bajarilishini tugatgandan keyin ham, o'zining tashqi (leksik) ko'rinish sohasidagi o'zgaruvchilarga kirishni saqlab qoladigan funksiya.

Batafsil javob

JavaScript'dagi har bir funksiya u yaratilgan muhitni "eslab qoladi". Bu shundan sodir bo'ladiki, dvigatel o'zgaruvchilar qiymatlarini nusxalash o'rniga ko'rinish sohasiga (scope) havolani saqlaydi.

Closure'lar quyidagilar uchun ishlatiladi:

  • Holatni inkapsulyatsiya qilish — klasslarsiz shaxsiy o'zgaruvchilar yaratish.
  • Karrilash va funksiya fabrikalari.
  • Memoizatsiya va debounce/throttling — holat chaqiruvlar orasida yashaydi.

Tez-tez uchraydigan xato — var bilan siklda closure, blokli ko'rinish sohasi yo'qligi sababli barcha funksiyalar bitta o'zgaruvchiga havola qiladi.

Misol

function createCounter() {
  let count = 0
  return function increment() {
    count++
    return count
  }
}

const counter = createCounter()
console.log(counter()) // 1
console.log(counter()) // 2
// `count` tashqaridan to'g'ridan-to'g'ri kirish uchun mavjud emas — bu shaxsiy holat

// var bilan klassik tuzoq:
for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 0) // 3, 3, 3
}
for (let j = 0; j < 3; j++) {
  setTimeout(() => console.log(j), 0) // 0, 1, 2
}

Qo'shimcha savollar

  • Nega siklda let closure'lar bilan muammoni "tuzatadi", var esa yo'q?
  • Closure'lar xotira sizib chiqishiga (memory leak) olib kelishi mumkinmi?
  • #privateField o'rniga closure orqali shaxsiy maydonlarni qanday amalga oshirish mumkin?