JavaScriptda TDZ (Temporal Dead Zone) va hoisting xususiyatlari o‘zgaruvchilarni qanday boshqarilishi va ularga qachon kirishish mumkinligini belgilaydi. Bu tushunchalar asosan var
, let
va const
bilan bog‘liq. Keling, har birini batafsil tushuntirib o‘tamiz va bloklar bilan qanday ishlashini ko‘rib chiqamiz.
1. Hoisting
Hoisting bu JavaScriptning o‘zgaruvchilar va funksiyalarni aniqlanishidan oldin ko‘tarish xususiyatidir. Bu xususiyat tufayli o‘zgaruvchilar yoki funksiyalarni ularni aniqlashdan oldin ham chaqirishga imkon beradi.
var
bilan hoisting
var
yordamida aniqlangan o‘zgaruvchilar hoisting qilinadi. Bu o‘zgaruvchilarni deklaratsiyasi avtomatik ravishda kodning yuqorisiga ko‘tariladi, lekin ularning qiymati undefined
bo‘ladi, chunki ular faqat dastur bajarilayotganda qiymat oladi.
- Misol:
console.log(x); // undefined
var x = 5;
console.log(x); // 5
Bu misolda x
o‘zgaruvchisi hoisting qilinadi, lekin x
ga qiymat berilmagani uchun dastlab undefined
bo‘ladi.
- Blokda
var
:var
ning yana bir xususiyati shundaki, u blok scopingga rioya qilmaydi, ya’ni funksiyaning ichida aniqlangan bo‘lsa ham global ko‘lamda mavjud bo‘ladi.
if (true) {
var y = 10;
}
console.log(y); // 10
Bu yerda y
global bo‘lib qoldi, chunki var
blok scopingni hisobga olmaydi.
let
va const
bilan hoisting
let
va const
ham hoisting qilinadi, lekin ularga Temporal Dead Zone (TDZ) qo‘llaniladi. Ya’ni, o‘zgaruvchiga deklaratsiya qilinmaguncha unga kirishish mumkin emas va ularni aniqlashdan oldin ishlatishga urinishda xato yuzaga keladi.
- Misol:
console.log(a); // ReferenceError: Cannot access 'a' before initialization
let a = 5;
Bu misolda a
o‘zgaruvchisi hoisting qilinadi, lekin deklaratsiyaga qadar u TDZda bo‘ladi, shuning uchun unga kirishish mumkin emas.
- Blokda
let
vaconst
:let
vaconst
bilan aniqlangan o‘zgaruvchilar blok ko‘lamiga ega. Bu degani, ular faqat o‘sha blok ichida mavjud bo‘ladi.
if (true) {
let b = 20;
const c = 30;
console.log(b); // 20
console.log(c); // 30
}
console.log(b); // ReferenceError: b is not defined
console.log(c); // ReferenceError: c is not defined
Bu yerda b
va c
faqat if
blok ichida mavjud, tashqarida ularga kirishishga urinishda xato bo‘ladi.
2. Temporal Dead Zone (TDZ)
TDZ bu o‘zgaruvchi deklaratsiya qilinmaguncha unga kirishish mumkin bo‘lmagan vaqtinchalik hududdir. Bu holat faqat let
va const
o‘zgaruvchilariga taalluqli bo‘lib, ular hoisting qilinsa ham, deklaratsiyaga qadar o‘z qiymatlarini olmaguncha ishlatib bo‘lmaydi.
- Misol:
{
console.log(x); // ReferenceError: Cannot access 'x' before initialization
let x = 10;
}
Bu yerda x
o‘zgaruvchisi blok ichida aniqlangan, lekin hoisting tufayli deklaratsiyaga qadar TDZ da bo‘ladi, va unga deklaratsiya qilinishidan oldin kirishishga urinishda ReferenceError yuzaga keladi.
TDZ blok ichida bo‘lgan har qanday let
yoki const
o‘zgaruvchi uchun amal qiladi va u deklaratsiya qilinmaguncha davom etadi.
3. Bloklar va O‘zgaruvchilar
Bloklar JavaScriptda {}
figurali qavslar bilan ifodalanadi va o‘zgaruvchilar blok ichida aniqlansa, ularning ko‘lami faqat o‘sha blok bilan cheklangan bo‘lishi mumkin.
Global va lokal o‘zgaruvchilar:
var
global yoki funksiyaviy ko‘lamda ishlaydi.let
vaconst
blok ko‘lamiga ega.- Misol:
if (true) {
var globalVar = "I'm global";
let blockLet = "I'm block-scoped";
const blockConst = "I'm also block-scoped";
}
console.log(globalVar); // "I'm global"
console.log(blockLet); // ReferenceError: blockLet is not defined
console.log(blockConst); // ReferenceError: blockConst is not defined
Bu misolda var
global bo‘lib qoladi, lekin let
va const
faqat blok ichida ko‘rinadi.
Xulosa:
-
Hoisting — bu o‘zgaruvchilar va funksiyalarni aniqlashdan oldin ko’tarish jarayoni.
var
bilan hoisting qilinadi, lekin dastlab qiymatiundefined
.let
vaconst
ham hoisting qilinadi, lekin ular **Temporal Dead Zone (TDZ)**da bo’ladi va deklaratsiyaga qadar ularga kirishib bo‘lmaydi.
-
TDZ (Temporal Dead Zone) — o‘zgaruvchi deklaratsiya qilinmaguncha unga kirishish mumkin bo‘lmagan hudud. Bu faqat
let
vaconst
o‘zgaruvchilari uchun amal qiladi. -
Blok scoplar —
let
vaconst
blok ichida aniqlanadi va faqat shu blok ichida ishlaydi,var
esa global yoki funksiyaviy ko‘lamda ishlaydi.
Shuning uchun let
va const
ko’pincha hozirgi zamonaviy JavaScript kod yozishda ishlatiladi, chunki ular kodning xatolikka moyilligini kamaytiradi va blok darajasida ko‘lami cheklaydi.
Ulashish: