O'zgaruvchilar — var, let, const va ularning farqi
Muammodan boshlaylik
JavaScript da o'zgaruvchi e'lon qilishning uchta usuli bor: var, let, const. Ko'pchilik bularni bir xil deb o'ylaydi — faqat yozilishi boshqacha. Aslida ular juda farq qiladi. Noto'g'ri tanlash — topish qiyin bo'lgan xatolarga olib keladi.
var x = 1;
if (true) {
var x = 2; // xuddi shu x ni o'zgartirdi!
}
console.log(x); // 2 — kutilmagan natija
Bu xato ko'p dasturchilarni chalg'itgan. let va const aynan shu muammoni hal qilish uchun ES6 (2015) da qo'shilgan.
O'zgaruvchi nima?
O'zgaruvchi — ma'lumotni saqlash uchun nomlangan "quti". Siz qutiga qiymat solasiz, keyin nom orqali o'sha qiymatni olasiz.
Hayotiy o'xshatma: maktab xonasidagi shkaf. Har bir shkafning raqami bor — bu o'zgaruvchi nomi. Ichida kitob, daftar yoki boshqa narsa — bu qiymat. Siz "5-shkaf" desangiz — o'sha shkafning ichidagi narsani olasiz.
const — qulfli shkaf. Bir marta solib, qayta o'zgartirib bo'lmaydi.
let — oddiy shkaf. Xohlagan vaqt ichini almashtirish mumkin.
var — eski, buzuq shkaf. Ishlaydi, lekin kutilmagan joylarda ochiladi.
var — nima muammo?
var JavaScript ning dastlabki versiyasidan bor. Lekin ikkita jiddiy muammosi bor.
Muammo 1: Function scope, block scope emas
var faqat funksiya ichida cheklangan. if, for, while bloki uni cheklamaydi.
if (true) {
var name = "Ali"; // var — blok ichida e'lon qilindi
}
console.log(name); // "Ali" — blokdan tashqarida ham ko'rinadi!
let bilan:
if (true) {
let name = "Ali"; // let — blok ichida cheklangan
}
console.log(name); // ReferenceError: name is not defined
Bu nima uchun muhim? Katta kodda var bilan e'lon qilingan o'zgaruvchi kutilmagan joylarda "ko'rinib" qoladi — xatolarni topish qiyinlashadi.
Muammo 2: Qayta e'lon qilish mumkin
var user = "Ali";
// ... 100 qator kod ...
var user = "Vali"; // xato yo'q! Lekin bu xato — birinchi user yo'qoldi
console.log(user); // "Vali"
let bilan bu xato darhol ko'rinadi:
let user = "Ali";
let user = "Vali"; // SyntaxError: Identifier 'user' has already been declared
let — qachon ishlatiladi?
let — qiymati o'zgarishi mumkin bo'lgan o'zgaruvchilar uchun. Block scope — faqat {} ichida ko'rinadi.
let count = 0;
for (let i = 0; i < 3; i++) { // i faqat for ichida
count++;
}
console.log(count); // 3
console.log(i); // ReferenceError: i is not defined
let ni qayta e'lon qilib bo'lmaydi, lekin qiymatini o'zgartirish mumkin:
let score = 0;
score = 10; // ✅ qiymat o'zgardi
score = 20; // ✅ yana o'zgardi
let score = 5; // ❌ SyntaxError — qayta e'lon qilib bo'lmaydi
const — qachon ishlatiladi?
const — qiymati o'zgarmaydigan o'zgaruvchilar uchun. E'lon qilingandan keyin qayta tayinlab bo'lmaydi.
const PI = 3.14159;
PI = 3; // ❌ TypeError: Assignment to constant variable
Nima uchun const ko'p ishlatiladi?
Zamonaviy JavaScript da const — standart tanlov. Sababi: o'zgaruvchi o'zgarmasligini bilsangiz — kod o'qish osonlashadi. "Bu qiymat o'zgarmaydi" degan kafolat bor.
Qoida oddiy: avval const ishlatib ko'r. Agar o'zgartirish kerak bo'lsa — let ga o'tkazasiz.
const ob'ekt va massivlar bilan
const o'zgaruvchini qayta tayinlashni taqiqlaydi — lekin ob'ekt yoki massiv ichini o'zgartirish mumkin:
const user = { name: "Ali", age: 25 };
user.age = 26; // ✅ ichini o'zgartirish mumkin
user.city = "Toshkent"; // ✅ yangi maydon qo'shish mumkin
user = { name: "Vali" }; // ❌ TypeError — qayta tayinlab bo'lmaydi
const colors = ["qizil", "yashil"];
colors.push("ko'k"); // ✅ massivga qo'shish mumkin
colors = []; // ❌ TypeError — qayta tayinlab bo'lmaydi
Nima uchun shunday? const o'zgaruvchining manzilini qulflaydi — ob'ekt xotirada qayerda turganini. Ob'ektning ichki qiymatlari boshqa joyda saqlanadi, shuning uchun ular o'zgarishi mumkin.
Uchala farqi — jadval
| Xususiyat | var | let | const |
|---|---|---|---|
| Scope | Function | Block | Block |
| Qayta e'lon | ✅ | ❌ | ❌ |
| Qayta tayinlash | ✅ | ✅ | ❌ |
| Hoisting | ✅ (undefined) | ✅ (TDZ) | ✅ (TDZ) |
TDZ (Temporal Dead Zone) — let va const e'lon qilinishidan oldin ishlatilsa xato beradi. var esa undefined qaytaradi. Bu haqda keyingi darslarda batafsil.
Qaysi birini tanlash kerak?
1. Avval const ishlatib ko'r
2. Agar qiymat o'zgarishi kerak bo'lsa — let
3. var — hech qachon (eski kod bilan ishlashdan tashqari)
Amalda:
const API_URL = "https://api.example.com"; // o'zgarmaydi — const
const user = { name: "Ali" }; // ob'ekt — const (ichini o'zgartirish mumkin)
let count = 0; // o'zgaradi — let
let isLoading = true; // o'zgaradi — let
for (let i = 0; i < 10; i++) { // sikl o'zgaruvchisi — let
// ...
}
Tez-tez uchraydigan xatolar
const ni e'lon qilmasdan tayinlash:
const x; // ❌ SyntaxError: Missing initializer in const declaration
x = 5;
const e'lon qilingan zahoti qiymat berilishi shart.
var ni for siklida ishlatish:
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 100);
}
// 0, 1, 2 kutiladi — lekin 3, 3, 3 chiqadi
Sababi: var block scope emas — barcha setTimeout callback lari bir xil i ni ko'radi, sikl tugaganda i = 3. let bilan har iteratsiya o'z i siga ega bo'ladi:
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 100);
}
// 0, 1, 2 — to'g'ri natija
const ob'ektni "o'zgarmas" deb o'ylash:
const config = { debug: false };
config.debug = true; // ✅ bu ishlaydi — xato emas!
const faqat qayta tayinlashni taqiqlaydi. Ob'ekt ichini o'zgartirish mumkin. Agar haqiqatan o'zgarmas ob'ekt kerak bo'lsa — Object.freeze() ishlatiladi.
Xulosa
var — eski, function scope, qayta e'lon qilish mumkin. Zamonaviy kodda ishlatilmaydi.
let — block scope, qiymati o'zgarishi mumkin. Sikllar, shartli o'zgaruvchilar uchun.
const — block scope, qayta tayinlab bo'lmaydi. Standart tanlov — avval const, kerak bo'lsa let.
Keyingi dars
3-dars: Ma'lumot turlari — string, number, boolean, null, undefined, symbol, bigint