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
letclosure'lar bilan muammoni "tuzatadi",varesa yo'q? - Closure'lar xotira sizib chiqishiga (memory leak) olib kelishi mumkinmi?
#privateFieldo'rniga closure orqali shaxsiy maydonlarni qanday amalga oshirish mumkin?