JavaScript da var, let va const: ko‘rinish sohasi va hoisting
Asoslar3 daqInnovialabs tahririyati
Qisqacha
Odatiy holatda const, o‘zgaruvchini qayta tayinlash kerak bo‘lsa let ishlating; var dan qoching — u butun funksiyada ko‘rinadi va undefined bilan ko‘tariladi, bu esa yashirin xatolarga olib keladi.
Qisqa javob
const— blok ko‘rinish sohasi, qayta tayinlab bo‘lmaydi. Odatiy holatda shuni ishlating.let— blok ko‘rinish sohasi, qayta tayinlash mumkin. Hisoblagichlar, yig‘uvchilar va haqiqatan o‘zgaradigan qiymatlar uchun.var— funksiya ko‘rinish sohasi,undefinedqiymati bilan ko‘tariladi, qayta e’lon qilish mumkin. Yangi kodda ishlatmang.
| var | let | const | |
|---|---|---|---|
| Ko‘rinish sohasi | funksiya | blok | blok |
| Qayta tayinlash | ha | ha | yo‘q |
| Qayta e’lon qilish | ha | yo‘q | yo‘q |
| E’londan oldin | undefined | ReferenceError (TDZ) | ReferenceError (TDZ) |
| Majburiy boshlang‘ich qiymat | yo‘q | yo‘q | ha |
Funksiya va blok ko‘rinish sohasi
Blok — figurali qavslar ichidagi hamma narsa: if, for, while yoki shunchaki { }. let va const faqat blok ichida yashaydi. var bloklarni e’tiborsiz qoldiradi va butun funksiyaga (yoki global sohaga) tegishli bo‘ladi.
function demo() {
if (true) {
var a = 1;
let b = 2;
}
console.log(a); // 1 — var if blokidan «oqib chiqdi»
console.log(b); // ReferenceError: b is not defined
}
var ning bu oqib chiqishi ko‘p muammolarning ildizi: sikl yoki shart uchun lokal deb o‘ylagan o‘zgaruvchingiz butun funksiyada ko‘rinadi va o‘zgartirilishi mumkin.
Hoisting va vaqtinchalik o‘lik zona
Hoisting (ko‘tarilish) — dvigatel e’lonlarni o‘z sohasidagi kod bajarilishidan oldin ro‘yxatga oladi. Uchala kalit so‘z ham ko‘tariladi, lekin har xil:
vardarhol yaratiladi vaundefinedbilan boshlanadi.letvaconstyaratiladi, lekin boshlang‘ich qiymat olmaydi. E’lon qatori bajarilmaguncha o‘zgaruvchi vaqtinchalik o‘lik zonada (TDZ) bo‘ladi va har qanday murojaatReferenceErrorberadi.
console.log(x); // undefined
var x = 5;
console.log(y); // ReferenceError: Cannot access 'y' before initialization
let y = 5;
TDZ foydali xatti-harakat: o‘zgaruvchini qiymat olmasdan o‘qish deyarli har doim xato, va let/const buni jimgina undefined berish o‘rniga baland ovozda bildiradi.
Funksiya e’lonlari (function declaration) tanasi bilan to‘liq ko‘tariladi, shuning uchun ularni ta’rifidan yuqorida chaqirish mumkin. const ga tayinlangan funksiya ifodalari TDZ qoidalariga bo‘ysunadi.
Sikldagi klassik closure xatosi
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 0);
}
// 3, 3, 3
Butun funksiya uchun bitta i mavjud. Callback lar sikl tugagandan keyin ishlaydi, o‘sha paytda esa i 3 ga teng.
let bilan har bir iteratsiya yangi bog‘lanish oladi va har bir callback o‘z qiymatini ushlab qoladi:
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 0);
}
// 0, 1, 2
let paydo bo‘lishidan oldin yangi soha yaratish uchun sikl tanasini darhol chaqiriladigan funksiyaga o‘rashardi. Bugun let buni bitta so‘z bilan hal qiladi.
const obyektlarni muzlatmaydi
const qiymatni emas, bog‘lanishni himoya qiladi. O‘zgaruvchiga yangi obyekt tayinlab bo‘lmaydi, lekin u ko‘rsatayotgan obyektni o‘zgartirish mumkin.
const user = { name: "Aziz" };
user.name = "Dilnoza"; // OK — obyekt o‘zgardi
user = {}; // TypeError: Assignment to constant variable
const list = [1, 2];
list.push(3); // OK
O‘zgarmas obyekt kerak bo‘lsa, Object.freeze() (yuzaki muzlatish) dan foydalaning yoki kodni eskisini o‘zgartirish o‘rniga yangi obyektlar yaratadigan qilib yozing.
Oddiy qoida
- Avval
constyozing. - O‘zgaruvchini haqiqatan qayta tayinlash kerak bo‘lgandagina
letga almashtiring. - Yangi kodda
varishlatmang. Buni linter bilan mustahkamlash mumkin — masalan, ESLint dagino-varvaprefer-constqoidalari.
Kod o‘qish uchun ham qulayroq bo‘ladi: let ni ko‘rsangiz, qiymat pastroqda qayerdadir o‘zgaradi.
Ko‘p uchraydigan xatolar
constmassiv va obyektlarni faqat o‘qish uchun qiladi deb o‘ylash.- Asinxron callback li sikllarda
varishlatish. - Blok ichida
lete’lon qilib, undan keyin ham ko‘rinishini kutish. - «Hoisting bor» deb o‘zgaruvchiga funksiya boshida murojaat qilish —
let/constbilan bu xato. - Uzun funksiyada tasodifan
varni qayta e’lon qilib, qiymatni ustidan yozib yuborish.