JavaScript'da ko'rinish doirasi (Scope turlari), var vs let/const, compilation va execution bosqichlari, Hoisting mexanizmi, Temporal Dead Zone (TDZ) va Scope Chain.
Bu — JavaScript'ni chuqur tushunish uchun eng muhim va, ayni paytda, eng ko'p chalkashtiriladigan mavzulardan biri. Chapter 1'da Scope haqida yuzaki gapirgan edik — endi uni ichki mexanizmigacha ochib beramiz.
Scope — kodning qaysi qismida variable "ko'rinishi" (ishlatilishi mumkinligi)ni belgilaydigan hudud.
JavaScript'da 3 xil scope mavjud:
{} ichida ko'rinadi (let/const uchun).🏢 Bir binoni tasavvur qiling:
script.jsJavaScriptlet globalVar = "Men hammayoqdan ko'rinaman";function myFunction() {let functionVar = "Men faqat shu function ichida ko'rinaman";if (true) {let blockVar = "Men faqat shu block ichida ko'rinaman";console.log(globalVar); // ✅ ishlaydiconsole.log(functionVar); // ✅ ishlaydiconsole.log(blockVar); // ✅ ishlaydi}console.log(blockVar); // ❌ Xatolik — blockVar bu yerda mavjud emas}
code.textTEXTGlobal Scope│├── globalVar│└── Function Scope (myFunction)│├── functionVar│└── Block Scope (if)│└── blockVar
Ichki scope tashqi scope'dagi variable'larni ko'ra oladi, lekin aksincha emas. Bu — "lexical scoping" deb ataladi (scope kod qanday yozilganiga qarab belgilanadi, dastur ishlash vaqtida emas).
var — faqat function scopega ega, let/const esa block scopega ega. Bu farq ko'p xatolarga sabab bo'ladi.
script.jsJavaScriptif (true) {var x = 10;let y = 20;}console.log(x); // 10 — ishlaydi! (var block'ni "sezmaydi")console.log(y); // Xatolik — y aniqlanmagan
var bilan yaratilgan x — if blokining ichida yozilgan bo'lsa-da, u block scope'ni "hurmat qilmaydi", faqat function (yoki global) scope'ni hurmat qiladi. Shuning uchun if blokidan tashqarida ham ko'rinadi.
let bilan yaratilgan y esa haqiqiy block scope'ga ega — if blokidan tashqarida umuman mavjud emas.
⚠️ Common Mistake
Loop ichida var ishlatish — klassik xato manbai:
script.jsJavaScriptfor (var i = 0; i < 3; i++) {setTimeout(() => console.log(i), 100);}// Natija: 3, 3, 3 (kutilgan: 0, 1, 2)
Sabab: var — function/global scope'ga ega, shuning uchun barcha setTimeout callback'lari bitta xuddi shu i o'zgaruvchisiga ishora qiladi, va loop tugagach uning qiymati 3 bo'lib qoladi.
✅ To'g'ri:
script.jsJavaScriptfor (let i = 0; i < 3; i++) {setTimeout(() => console.log(i), 100);}// Natija: 0, 1, 2
let har bir iteratsiyada yangi i yaratadi, shuning uchun har bir callback o'zining alohida isini "eslab qoladi" (bu — Chapter 12'dagi Closure tushunchasi bilan bog'liq).
Hoisting — JavaScript engine kodni ishga tushirishdan oldin, variable va function e'lonlarini "yuqoriga ko'taradi" (xotirada oldindan ajratib qo'yadi).
Chunki natija "sehrli" ko'rinadi — kod yozilgan tartibga zid ravishda ishlaydi:
script.jsJavaScriptconsole.log(message);var message = "Salom";
Natija: undefined (xatolik emas!).
JavaScript kodni ikki bosqichda ishlaydi:
var va function e'lonlarini xotiraga oldindan yozib qo'yadi (lekin qiymatlarisiz, faqat "bunday nom mavjud" deb).code.textTEXTYozilgan kod: JavaScript qanday "ko'radi":console.log(message); var message; // hoisting bo'ladiconsole.log(message); // undefinedvar message = "Salom"; message = "Salom";
Function Declaration'lar to'liq hoisting qilinadi (nomi ham, tanasi ham):
script.jsJavaScriptsayHi(); // ✅ ishlaydi!function sayHi() {console.log("Salom!");}
Lekin Function Expression hoisting qilinmaydi (Chapter 6'da ko'rgan edik):
script.jsJavaScriptsayHi(); // ❌ Xatolikconst sayHi = function () {console.log("Salom!");};
💡 Key Idea
Faqat e'lon (declaration) hoisting qilinadi, qiymat berish (assignment) emas. Shuning uchun var x = 5 da faqat var x hoisting bo'ladi, = 5 qismi o'z joyida qoladi.
let va const ham aslida hoisting qilinadi, lekin ular vardan farqli — e'londan oldin ishlatishga urinilsa, undefined emas, xatolik beradi.
Ushbu "e'londan oldingi, ishlatib bo'lmaydigan hudud" — Temporal Dead Zone (TDZ) deb ataladi.
🚧 TDZ'ni qurilish maydoni deb tasavvur qiling: bino (variable) rejalashtirilgan (xotirada joy ajratilgan), lekin hali qurilmagan. Siz o'sha yerga kira olmaysiz (variable'ni ishlata olmaysiz) toki qurilish (e'lon qatori) tugamaguncha.
script.jsJavaScriptconsole.log(age); // ❌ ReferenceError: Cannot access 'age' before initializationlet age = 25;
| Xususiyat | var | let / const |
|---|---|---|
| Hoisting bo'ladimi? | Ha | Ha |
| E'londan oldin ishlatilsa | undefined qaytaradi | Xatolik (TDZ) beradi |
🔥 Important
TDZ aslida xavfsizlik xususiyati — u dasturchini "hali tayyor bo'lmagan" variable'ni ishlatishdan ogohlantiradi, vardagi kabi jimgina undefined bilan yashirmaydi.
Agar variable joriy scope'da topilmasa, JavaScript uni tashqi scope'lardan qidiradi — bu jarayon Scope Chain deb ataladi.
script.jsJavaScriptlet a = "global";function outer() {let b = "outer";function inner() {let c = "inner";console.log(a, b, c); // "global outer inner"}inner();}outer();
inner() ichida c qidiriladi — topiladi (o'z scope'ida).b qidiriladi — innerda yo'q, outerdan topiladi.a qidiriladi — innerda ham, outerda ham yo'q, global scope'dan topiladi.code.textTEXTGlobal Scope (a)↓outer() Scope (b)↓inner() Scope (c)inner() → c → b (outer'dan) → a (global'dan)
🔗 Connection
Scope Chain — Chapter 12'da o'rganiladigan Closure tushunchasining asosini tashkil qiladi. Closure aslida — function o'zining scope chain'ini "eslab qolishi"dir.
Task:
Global scope'da bitta variable, function ichida boshqa variable yarating va ikkalasini ham function ichidan chiqarib ko'ring.
Required Concepts:
Task:
Quyidagi kodni ishga tushirmasdan, natijasini oldindan ayting, keyin tekshiring:
script.jsJavaScriptconsole.log(typeof myVar);console.log(typeof myLet);var myVar = "test";let myLet = "test";
Required Concepts:
var va let hoisting'da boshqacha xatti-harakat qiladi.Task:
Loop ichida var ishlatilgani sabab yuzaga kelgan xatoni let yordamida tuzating:
script.jsJavaScriptfor (var i = 1; i <= 3; i++) {setTimeout(function () {console.log("Son: " + i);}, 1000);}// Muammo: 3 marta "Son: 4" chiqadi
Required Concepts:
var vs let scopesetTimeoutscript.jsJavaScriptfunction test() {console.log(a);var a = 5;console.log(a);}test();
🧠 Think first! Javobni ko'rishdan oldin kamida 30 soniya o'ylang.
<details> <summary>Answer</summary> undefined 5Why?
var a hoisting tufayli function boshiga "ko'tariladi" (lekin qiymatisiz), shuning uchun birinchi console.log xatolik bermaydi, faqat undefined chiqaradi. Ikkinchi console.loggacha aga 5 qiymati berilgan bo'ladi.
Quyidagi kodda muammo bor:
script.jsJavaScriptfunction createCounters() {let counters = [];for (var i = 0; i < 3; i++) {counters.push(function () {return i;});}return counters;}let myCounters = createCounters();console.log(myCounters[0]());console.log(myCounters[1]());console.log(myCounters[2]());
Your Task:
Yechim: varni letga almashtirish kerak — har bir iteratsiyada yangi i yaratiladi:
</details>script.jsJavaScriptfunction createCounters() {let counters = [];for (let i = 0; i < 3; i++) {counters.push(function () {return i;});}return counters;}let myCounters = createCounters();console.log(myCounters[0]()); // 0console.log(myCounters[1]()); // 1console.log(myCounters[2]()); // 2
var — function scope, let/const — block scope.let/const e'londan oldin ishlatilsa xatolik beradigan hudud.let/const ishlatish tavsiya etiladi — block scope xavfsizroq.let ishlatish — har bir iteratsiyada yangi scope yaratadi, bu closure bilan ishlashda muhim.script.jsJavaScript// Scope turlarilet global1 = "global"; // Global scopefunction fn() {let local = "function"; // Function scopeif (true) {let block = "block"; // Block scope}}// Hoistingconsole.log(x); // undefined (var hoisting)var x = 5;console.log(y); // ReferenceError (TDZ)let y = 5;
Mavzu bo‘yicha tushunchalaringizni interaktiv test orqali sinovdan o‘tkazing va natijalarni bilib oling.
Darslikda o‘rganilgan qoidalarga asosan real kod yozing, testlardan o‘tkazing va yechimlarni mustahkamlang.
Test Sinovi
Hali topshirilmagan (kamida 75% kerak)
Amaliy Masalalar
0 / 3 ta yechildi (kamida 75% kerak)
Dars sifati va mazmunini yaxshilash uchun o‘z haqqoniy bahoingizni qoldiring.
Mavzuni to‘liq o‘zlashtirish uchun test sinovi, amaliy kodlash va bog‘liq darslar
O‘z bilimingizni interaktiv test savollari orqali tekshiring va darhol xatolarni tahlil qiling.
Nazariyani real kod yozish bilan mustahkamlang, avtomatik testlardan o‘ting va XP to‘plang.
Kurs bo‘yicha keyingi va bog‘liq mavzular: