Mundarija (28)
- Bu darsda
- 1. Nega bu kerak?
- 2. TDZ nima?
- 2.1 Ta'rif
- 2.2 Zona chegaralari — sxemada
- 3. Nega "temporal" — vaqtga oid?
- 3.1 Joy emas, vaqt
- 3.2 Callback'lar — "keyinroq bajariladigan" kod
- 3.3 Bu vazifalar da qanday ko'rinadi
- 4. TDZ yashirinadigan joylar
- 4.1 O'ziga o'zi murojaat va soyalash
- 4.2 typeof endi xavfsiz emas
- 4.3 Default parametrlar
- 4.4 switch ning umumiy bloki
- 5. Nega JavaScript'ga TDZ kerak?
- 6. Ko'p uchraydigan xatolar
- 6.1 Xato qatorida sabab izlash
- 6.2 Qayta nomlash soyalash yaratadi
- 6.3 Default parametrlar tartibi
- 6.4 typeof bilan "bor-yo'qligini" tekshirish
- 7. Mashqlar
- 1-mashq (oson): Qaysi qator xato beradi?
- 2-mashq (o'rta): Chegirma funksiyasi
- 3-mashq (qiyin): Nima uchun "ba'zan" ishlaydi?
- 4-mashq: Vazifalar qadami — "begunoh" qayta nomlash
- 8. Real ishda
- Xulosa
- Manbalar
JavaScript Temporal Dead Zone (TDZ): Cannot access before initialization xatosi
Qisqacha: Temporal Dead Zone (TDZ, "vaqtinchalik o'lik zona") —
let,constyokiclassnomi scope'da mavjud bo'lgan, lekin hali qiymat olmagan davr: scope boshidan e'lon qatori bajarilguncha. Bu davrda nomga har qanday murojaat — o'qish, yozish, hattotypeof—ReferenceError: Cannot access '…' before initializationberadi. Zona kodning joylashuviga emas, bajarilish vaqtiga bog'liq: e'londan yuqorida yozilgan funksiya, e'londan keyin chaqirilsa, bemalol ishlaydi.
Bu darsda
- TDZ qayerda boshlanib, qayerda tugashini aniq ayta olasiz.
- Nega u "vaqtinchalik" (temporal) deyilishini misol bilan tushuntirasiz.
typeofTDZ'da nega xavfsiz emasligini bilasiz.- Default parametrlar, soyalash va
switchdagi TDZ tuzoqlarini tanib, tuzata olasiz. vazifalar.jsda TDZ keltirib chiqaradigan "begunoh" qayta nomlashni topasiz.
Oldin bilishingiz kerak: Hoisting: e'lonlar "ko'tarilishi", Leksik scope va scope zanjiri, Parametrlar, argumentlar va default qiymatlar.
1. Nega bu kerak?
Bu xabarni kursda kamida olti marta ko'rdingiz:
ReferenceError: Cannot access 'narx' before initializationlet va const, typeof, default qiymatlar, arrow funksiyalar, Scope asoslari va Stack trace darslarida — har safar "nega aynan shunday ekanini TDZ darsida ko'ramiz" degan edik. Mana shu dars.
O'tgan darsda asosiy javobni oldik: let, const va class ko'tariladi, lekin "tayyor emas" holatida (Hoisting). Bugun shu "tayyor emas" davrining aniq chegaralarini va u yashirinadigan joylarni ko'ramiz. Bu xato ba'zan kutilmagan joyda chiqadi — masalan, kodda bitta o'zgaruvchini qayta nomlaganingizdan keyin. Uni tez tanib olish — vaqtingizni tejaydi.
2. TDZ nima?
2.1 Ta'rif
Vaqtinchalik o'lik zona (Temporal Dead Zone, TDZ) — let, const yoki class bilan e'lon qilingan nom mavjud, lekin hali initsializatsiya qilinmagan (boshlang'ich qiymat olmagan) davr. U ikki nuqta orasida:
- Boshi — nom tegishli scope'ning (blok, funksiya, modul) boshlanishi. Shu paytda yaratish bosqichi nomni muhitga yozadi.
- Oxiri — e'lon qatorining o'zi bajarilgan payt.
Bu oraliqda nomga har qanday murojaat — ReferenceError.
Hayotdan o'xshatish: yangi ochilayotgan do'kon. Eshik tepasida peshlavha allaqachon osilgan — nomi bor, hamma ko'radi. Lekin eshikda "Tez kunda ochiladi" yozuvi turibdi: ichkariga kirib bo'lmaydi. Ochilish lentasi kesilgan lahzadan boshlab — kiravering. Peshlavha — yaratish bosqichidagi nom. Lenta kesilishi — e'lon qatorining bajarilishi.
2.2 Zona chegaralari — sxemada
Blok ichidagi let uchun vaqt chizig'i. Chapdan o'ngga o'qing:
flowchart LR
A["Blok boshlandi:<br/>nom yozildi"] --> B["TDZ:<br/>tegish — ReferenceError"]
B --> C["let narx = 35000;<br/>bajarildi"]
C --> D["Ishlatish<br/>mumkin"]
D --> E["Blok tugadi:<br/>nom yo'qoldi"]E'lon qiymatsiz bo'lsa ham TDZ tugaydi. let stol; bajarilgach, stol — undefined, xatosiz:
let stol;
console.log(stol); // undefined
stol = 4;
console.log(stol); // 4const da qiymatsiz e'lon bo'lmaydi — u e'londa qiymat olishi shart (let va const).
Tekshirib ko'ring:
{ console.log("a"); let x = 1; console.log(x); }blokidaxning TDZ'i qaysi qatordan qaysi qatorgacha?
Javob
Blok ochilgan { dan let x = 1; bajarilguncha. Birinchi console.log("a") TDZ ichida bajariladi — lekin u x ga tegmaydi, shuning uchun xato yo'q. TDZ faqat nomga murojaat qilinganda xato beradi. let qatoridan keyingi console.log(x) — 1.
3. Nega "temporal" — vaqtga oid?
3.1 Joy emas, vaqt
"E'londan yuqoridagi qatorlar — o'lik zona" deb o'ylash oson. Lekin bu noto'g'ri. Zona — vaqt oralig'i, matn hududi emas. Isbot:
function stolniAyt() {
return `Stol: ${stol}`;
}
let stol = 4;
console.log(stolniAyt()); // Stol: 4stol 2-qatorda ishlatilgan — let dan yuqorida. Lekin xato yo'q. Sabab: 2-qator yozilgan joyda emas, chaqirilgan paytda bajariladi. Chaqiruv esa 6-qatorda — let allaqachon bajarilgandan keyin. Keyingi tugmasini bosib kuzating:
Endi chaqiruvni bitta qator yuqoriga ko'taramiz — funksiya o'zgarmaydi:
function stolniAyt() {
return `Stol: ${stol}`;
}
console.log(stolniAyt());
let stol = 4;ReferenceError: Cannot access 'stol' before initializationBir xil funksiya, bir xil 2-qator. Farq faqat qachon chaqirilganida. Shuning uchun xato xabaridagi qator raqami (2-qator) ko'pincha xatoning sababi emas — sabab chaqiruvning vaqtida.
3.2 Callback'lar — "keyinroq bajariladigan" kod
Callback ham shu qoidaga bo'ysunadi: u yozilganda emas, chaqirilganda bajariladi. Hodisa tinglovchisini eslang — u sahifa ochilganda ro'yxatga olinadi, lekin bosishda ishlaydi. Shuni Node'da kichik "navbat" bilan taqlid qilamiz:
const navbat = [];
navbat.push(() => console.log(`Xush kelibsiz, ${mehmon}!`));
const mehmon = "Bobur";
navbat.forEach((vazifa) => vazifa());Konsolda:
Xush kelibsiz, Bobur!Arrow funksiya mehmon e'lonidan oldin yaratildi va massivga qo'yildi. Lekin u faqat oxirgi qatorda chaqirildi — mehmon allaqachon tayyor. Agar navbat.forEach(...) ni const mehmon dan yuqoriga ko'chirsangiz — Cannot access 'mehmon' before initialization.
09-qismdagi tinglovchilar ham xuddi shunday: addEventListener ga berilgan funksiya skriptdagi istalgan const ni ishlata oladi — foydalanuvchi bosganda butun skript allaqachon bajarilib bo'lgan bo'ladi. Muammo faqat tinglovchi skript tugashidan oldin ishga tushsa chiqadi.
O'zingiz to'ldiring: navbat.push(...) qatori bajarilayotgan paytda mehmon turgan zonaning qisqa nomi — .
3.3 Bu vazifalar da qanday ko'rinadi
Hoisting darsidagi tajribani eslang: render(); faylning boshiga ko'chirilganda Cannot access 'royxat' before initialization chiqdi. Xato render ichida, royxat ishlatilgan qatorda ko'rsatildi. Lekin render ning kodi to'g'ri edi — noto'g'ri faqat chaqiruv vaqti edi. TDZ xatosini ko'rganda o'zingizdan birinchi navbatda so'rang: "bu kod qachon chaqirildi?"
4. TDZ yashirinadigan joylar
4.1 O'ziga o'zi murojaat va soyalash
Eng ko'p uchraydigan TDZ — bir xil nom ikki qavatda:
let narx = 10000;
{
const narx = narx * 1.1;
console.log(narx);
}ReferenceError: Cannot access 'narx' before initializationNiyat tushunarli: "tashqi narx dan 10% qimmatroq yangi narx". Lekin ichki const narx blok boshidanoq muhitda — tashqisini soyalaydi (Leksik scope). O'ng tomondagi narx * 1.1 hisoblanayotganda e'lon hali tugamagan: ichki narx TDZ'da, tashqisiga esa yo'l yopiq. Tuzatish: boshqa nom — const yangiNarx = narx * 1.1.
Xuddi shu sabab bilan let son = son + 1; ham — tashqarida son bo'lsa ham, bo'lmasa ham — xato beradi.
4.2 typeof endi xavfsiz emas
typeof darsida ko'rgan edik: umuman e'lon qilinmagan nomda typeof xato bermaydi:
console.log(typeof yoqNom); // undefinedBu xususiyat eski kodda "shu nom bormi?" deb tekshirish uchun ishlatilgan. Lekin TDZ'dagi nomda typeof ham ReferenceError beradi:
console.log(typeof narx);
let narx = 35000;ReferenceError: Cannot access 'narx' before initializationUch holatni yonma-yon qo'yamiz:
| Nom holati | typeof nom |
Oddiy murojaat nom |
|---|---|---|
| Umuman e'lon qilinmagan | "undefined" |
ReferenceError: nom is not defined |
let/const bor, lekin TDZ'da |
ReferenceError |
ReferenceError: Cannot access… |
| E'lon bajarilgan | haqiqiy tur | qiymat |
Paradoks: umuman yo'q nom — xavfsiz, bor, lekin tayyor emas nom — xato. TDZ qoidasi typeof uchun ham istisno qilmaydi. Shuning uchun "typeof hech qachon xato bermaydi" degan eski qoida 2015-yildan (ES2015, let/const paydo bo'lgandan) beri to'g'ri emas.
4.3 Default parametrlar
Default qiymatlar darsidan: parametrlar chapdan o'ngga, navbat bilan initsializatsiya qilinadi. Har parametr — o'zining kichik TDZ'i bilan. Default qiymat faqat o'zidan chapdagi parametrlarni ishlata oladi:
function bronQil(odam = stollar * 4, stollar = 1) {
return `${stollar} stol, ${odam} kishi`;
}
console.log(bronQil(undefined, 2));ReferenceError: Cannot access 'stollar' before initializationodam ning default'i hisoblanayotganda stollar hali TDZ'da — u o'ngda. Tartibni almashtiramiz:
function bronQil(stollar = 1, odam = stollar * 4) {
return `${stollar} stol, ${odam} kishi`;
}
console.log(bronQil()); // 1 stol, 4 kishi
console.log(bronQil(3)); // 3 stol, 12 kishi
console.log(bronQil(2, 6)); // 2 stol, 6 kishiQiziq tafsilot: asl, xato variantda bronQil(5, 2) chaqirilsa — xato yo'q. Default faqat argument berilmaganda (undefined) hisoblanadi. TDZ xatosi faqat ba'zi chaqiruvlarda chiqadi — shuning uchun u testlarda ko'zdan qochishi oson.
Yana bir chegara: default qiymat funksiya tanasidagi o'zgaruvchilarni ko'rmaydi. function f(a = ichki) { const ichki = 1; } chaqirilsa — ReferenceError: ichki is not defined. Bu TDZ emas: parametrlar tanadan tashqaridagi alohida muhitda yashaydi, tananing nomlari u yerda umuman yo'q.
4.4 switch ning umumiy bloki
switch ning barcha case lari bitta blokni bo'lishadi. Bir case da let e'lon qilib, boshqasida ishlatsangiz:
function narxniAyt(taom) {
switch (taom) {
case "osh":
let narx = 35000;
return narx;
case "manti":
narx = 30000;
return narx;
}
}
console.log(narxniAyt("manti"));ReferenceError: Cannot access 'narx' before initializationnarx butun switch bloki uchun bitta. "manti" bo'lganda case "osh" qatorlari bajarilmadi — let narx ga yetilmadi, TDZ tugamadi. Tuzatish: har case ni o'z { } bloki bilan o'rang — shunda har birida o'z narx i bo'ladi:
function narxniAyt(taom) {
switch (taom) {
case "osh": {
const narx = 35000;
return narx;
}
case "manti": {
const narx = 30000;
return narx;
}
}
}
console.log(narxniAyt("manti")); // 30000Tekshirib ko'ring:
function f(a = a) { return a; }—f(5)vaf()nima beradi?
Javob
f(5) — 5: argument berildi, default hisoblanmadi. f() — ReferenceError: Cannot access 'a' before initialization: default a ning o'zini o'qimoqchi, a esa hali initsializatsiya qilinmoqda — TDZ'da.
5. Nega JavaScript'ga TDZ kerak?
TDZ — "keraksiz qiyinchilik" emas. Uni ataylab, 2015-yilda let va const bilan birga qo'shishgan. Uch sabab:
- Xatoni darhol ko'rsatish.
vare'londan oldin jimginaundefinedberadi va "Buyurtma: undefined" ekranga chiqib ketadi (var). TDZ esa dasturni aynan muammoli joyda to'xtatadi. constva'dasi.const— "bu nom doim bitta qiymatga ega". Agar e'londan oldinundefinedko'rinsa,constikki xil qiymatga ega bo'lib qolardi: avvalundefined, keyin haqiqiysi. TDZ bunga yo'l qo'ymaydi:constni faqat haqiqiy qiymati bilan ko'rish mumkin.- Kelajak uchun. Til mualliflari keyinroq qo'shiladigan imkoniyatlar "e'londan oldin qiymat yo'q" qoidasiga tayana olishini xohlagan. Masalan,
classham shu qoidaga bo'ysunadi — uniclasssintaksisi darsida ko'ramiz.
Natijada qoida soddalashdi: let/const bilan "avval e'lon, keyin ishlatish" — buzilsa, darhol xato.
Tekshirib ko'ring: Agar TDZ bo'lmaganda va
conste'londan oldinundefinedqaytarganda,const narx = 35000;dan oldingiconsole.log(narx)nima chiqarardi? Bu nega yomon bo'lardi?
Javob
undefined chiqarardi — va keyin 35000. Bitta const dastur davomida ikki xil qiymatga ega bo'lib qolardi, "o'zgarmas" degan va'da buzilardi. Ustiga, undefined jimgina hisob-kitobga kirib, NaN yoki "undefined so'm" kabi natijalarni ekranga chiqarardi. TDZ buning o'rniga xatoni aynan murojaat qatorida ko'rsatadi.
6. Ko'p uchraydigan xatolar
6.1 Xato qatorida sabab izlash
TDZ xatosi ko'rsatgan qator — ko'pincha to'g'ri kod. «Nega "temporal"» bo'limidagi kabi: stolniAyt ning return qatori to'g'ri, chaqiruv esa erta. Tuzatish: stack trace'ni pastga qarab o'qing (Execution context) — qaysi chaqiruv bu kodni e'londan oldin ishga tushirganini toping.
6.2 Qayta nomlash soyalash yaratadi
Funksiya ichidagi o'zgaruvchiga "chiroyliroq" nom berdingiz — u tasodifan tashqi nom bilan bir xil bo'lib qoldi, va o'ng tomonda tashqisi ishlatilgan edi. Natija — «O'ziga o'zi murojaat va soyalash» bo'limidagi xato. «Vazifalar qadami» da aynan shuni ko'rasiz. Tuzatish: qayta nomlashda VS Code'ning F2 sini ishlating — u to'qnashuvni ko'rsatadi. ESLint (kodni ishga tushirmasdan xatolarini qidiradigan vosita, 12-qismda o'rganamiz) ham no-shadow qoidasi bilan topadi.
6.3 Default parametrlar tartibi
(odam = stollar * 4, stollar = 1) — o'ngdagiga tayanish. Tuzatish: bog'liq parametrni o'ngga qo'ying.
6.4 typeof bilan "bor-yo'qligini" tekshirish
if (typeof sozlama === "undefined") — e'lon qilinmagan nomda ishlaydi, TDZ'dagisida — xato. Tuzatish: o'z kodingizda nomni avval e'lon qiling (let sozlama = null;), keyin qiymatini tekshiring.
7. Mashqlar
1-mashq (oson): Qaysi qator xato beradi?
Har raqamlangan qator uchun ayting: ishlaydimi yoki TDZ xatosimi? (Har birini alohida tasavvur qiling — birinchi xato dasturni to'xtatadi.)
console.log(typeof menyu); // (1)
console.log(typeof taom); // (2)
let taom = "osh";
console.log(taom); // (3)
const tayyorla = () => taom.toUpperCase();
console.log(tayyorla()); // (4)Yechim
(1) undefined — menyu umuman e'lon qilinmagan, typeof xavfsiz. (2) ReferenceError — taom keyinroq let bilan e'lon qilingan, hozir TDZ'da. (3) osh — let bajarildi. (4) OSH — tayyorla ichidagi taom chaqiruv paytida tayyor.
2-mashq (o'rta): Chegirma funksiyasi
Funksiya chegirmaQol() chaqirilganda xato beradi. Parametrlarni o'zgartirib tuzating: summa sukut bo'yicha 100000, foiz — summa 200 000 dan katta bo'lsa 15, aks holda 10.
function chegirmaQol(
foiz = summa > 200000 ? 15 : 10,
summa = 100000,
) {
return summa - (summa * foiz) / 100;
}
console.log(chegirmaQol());Yechim
function chegirmaQol(
summa = 100000,
foiz = summa > 200000 ? 15 : 10,
) {
return summa - (summa * foiz) / 100;
}
console.log(chegirmaQol()); // 90000
console.log(chegirmaQol(300000)); // 255000
console.log(chegirmaQol(300000, 5)); // 285000Asl variantda foiz ning default'i summa ni o'qiydi — summa esa o'ngda, TDZ'da: Cannot access 'summa' before initialization. Endi summa chapda: u foiz dan oldin tayyor bo'ladi. Uchinchi chaqiruvda foiz berilgan — default umuman hisoblanmaydi.
3-mashq (qiyin): Nima uchun "ba'zan" ishlaydi?
Kod 3 ta osh uchun ishlaydi, 8 ta uchun — xato. Sababini toping, tuzating va tuzatilganini ikkala son bilan sinang.
function chekYoz(soni, chegirmaBor = soni > 5) {
if (chegirmaBor) {
return `${soni} ta osh: ${foiz}% chegirma`;
}
const foiz = 10;
return `${soni} ta osh: ${foiz}% chegirma faqat 6 tadan`;
}
console.log(chekYoz(3));
console.log(chekYoz(8));Yechim
chekYoz(3): chegirmaBor — false, if o'tkazib yuboriladi, const foiz = 10 bajariladi, keyin foiz o'qiladi — hammasi joyida: 3 ta osh: 10% chegirma faqat 6 tadan. chekYoz(8): if ichiga kiriladi va foiz o'qiladi — lekin const foiz qatori hali bajarilmagan: ReferenceError: Cannot access 'foiz' before initialization.
foiz butun funksiya tanasi uchun bitta. U if dan pastda yozilgan — if ichidagi murojaat uning TDZ'iga tushadi. Tuzatish — e'lonni ishlatishdan oldinga ko'chirish:
function chekYoz(soni, chegirmaBor = soni > 5) {
const foiz = 10;
if (chegirmaBor) {
return `${soni} ta osh: ${foiz}% chegirma`;
}
return `${soni} ta osh: ${foiz}% chegirma faqat 6 tadan`;
}
console.log(chekYoz(3)); // 3 ta osh: 10% chegirma faqat 6 tadan
console.log(chekYoz(8)); // 8 ta osh: 10% chegirmaNega "ba'zan"? TDZ — vaqtga oid. Xato faqat kod const qatoridan o'tmasdan nomga yetgan chaqiruvlarda chiqadi. 3 ta bilan sinagan dasturchi "ishlayapti" deb o'ylaydi. Shuning uchun shartning har tarmog'ini — if ning ikkala yo'lini — alohida sinash kerak.
4-mashq: Vazifalar qadami — "begunoh" qayta nomlash
kurs/mashqlar/10/22-tdz/ ga vazifalar nusxasini oling (yoki Hoisting darsidagi nusxani qayta tiklang). Asl loyihaga tegmaymiz.
Nusxadagi qoshniId funksiyasi:
function qoshniId(id) {
const qator = royxat.querySelector(`[data-id="${id}"]`);
const qoshni =
qator.nextElementSibling ?? qator.previousElementSibling;
return qoshni === null ? null : Number(qoshni.dataset.id);
}Jamoadoshingiz "qator — tushunarsiz nom, bu ro'yxatdagi element-ku" deb, qator ni hamma joyda royxat ga qayta nomladi (qo'lda, F2 siz).
- Shu o'zgarishni nusxada qiling. Sahifa ochiladimi? Ro'yxat chiziladimi?
- "Non olish" katagini bosing. Nima bo'ldi — ekranda va konsolda?
- Nega sahifa ochilganda xato chiqmadi, bosganda chiqdi?
- Javoblarni
javoblar.mdga yozing va to'g'ri nom taklif qiling.
Yechim
- Ha — sahifa ochiladi, uch vazifa, "2 ta vazifa qoldi, 1 ta bajarildi". Hech qanday xato yo'q.
- Katak belgilandi (brauzer uni o'zi belgiladi), lekin hisob o'zgarmadi — hamon "2 ta vazifa qoldi, 1 ta bajarildi". Konsolda:
Uncaught ReferenceError: Cannot access 'royxat' before initializationEndi ekran va holat bir-biriga zid: katak belgilangan, holat da esa vazifa hali bajarilmagan. Tinglovchi qoshniId(id) ni vazifaniAlmashtir dan oldin chaqiradi — xato o'sha yerda tinglovchini to'xtatdi va holat o'zgarmay qoldi.
qoshniIdichidagiconst royxat = royxat.querySelector(...): ichkiroyxatfunksiya boshidanoq tashqi (skript darajasidagi)royxatni soyalaydi. O'ng tomondagiroyxat.querySelectoresa ichkisini o'qiydi — u TDZ'da. Lekin bu faqatqoshniIdchaqirilganda sodir bo'ladi. Sahifa ochilganda u chaqirilmaydi — TDZ vaqtga oid. Bosish — birinchi chaqiruv.javoblar.mddagi taklif:qatorniroyxatemas,joriyQatoryokilideb nomlash — tashqi nomlar bilan to'qnashmaydigan nom. Va qayta nomlashniF2bilan qilish: VS Code to'qnashuvni oldindan ko'rsatadi.
Commit — mashqlar repoda:
git add 10/22-tdz
git commit -m "10/22: qayta nomlashdagi TDZ xatosini tahlil qil"8. Real ishda
- Intervyu. "TDZ nima?", "
letko'tariladimi?", "typeofqachon xato beradi?" — hoisting savoliga deyarli doim qo'shiladi. Eng kuchli javob — misol bilan: e'londan yuqorida yozilgan, lekin keyin chaqirilgan funksiya ishlaydi; demak TDZ — vaqt. - Refaktoring. Kodni tartiblashda funksiya va o'zgaruvchilar joyi o'zgaradi — TDZ xatolari aynan shunday paydo bo'ladi. Modul fayllari bir-birini import qilganda (aylanma import) ham shu xabar chiqadi — buni Modul semantikasi darsida ko'ramiz.
- Linter. ESLint'ning
no-use-before-definevano-shadowqoidalari TDZ xatolarining ko'pchiligini kod ishga tushmasdan oldin topadi (ESLint — 12-qismda). TypeScript ham "Block-scoped variable used before its declaration" deb ogohlantiradi (15-qismda).
Xulosa
- TDZ —
let/const/classnomi scope boshidan e'lon qatori bajarilguncha bo'lgan davr; bu davrda har qanday murojaat —ReferenceError: Cannot access '…' before initialization. - TDZ — vaqtga oid: e'londan yuqorida yozilgan kod, e'londan keyin bajarilsa, ishlaydi.
typeofe'lon qilinmagan nomda xavfsiz, TDZ'dagi nomda — xato.- Soyalash (
const narx = narx * 1.1), default parametrlar (o'ngdagiga tayanish) vaswitchning umumiy bloki — TDZ'ning uch asosiy yashirin joyi. - TDZ xatosini ko'rsangiz, so'rang: "bu kod qachon chaqirildi?"
Keyingi dars: Closure: funksiya o'z muhitini eslab qoladi — leksik muhit funksiya tugagandan keyin ham yashashi mumkinmi? Shu savol JavaScript'ning eng kuchli imkoniyatlaridan biriga olib keladi.
Manbalar
- MDN: "let" — "Temporal dead zone (TDZ)" bo'limi; "typeof" — "typeof and the TDZ" — developer.mozilla.org
- ECMAScript 2025 Language Specification: "Declarative Environment Records" (
InitializeBinding), "Static Semantics: Early Errors" — tc39.es/ecma262
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!