Eski "var"
Eng dastlabki JavaScript'da o'zgaruvchilar faqat var orqali e'lon qilinardi. Bugun uni deyarli ishlatmaymiz, ammo eski kodlarda tez-tez uchraydi va u let/constdan jiddiy farq qiladi. Uni tushunish kutilmagan xatolardan asraydi.
var qanday ishlaydi?
Birinchi qarashda var ham let kabi ko'rinadi โ o'zgaruvchi e'lon qiladi:
Ammo ichkaridan u boshqacha xatti-harakat qiladi. Uch asosiy farqni ko'ramiz.
1-farq: var da blok ko'lami YO'Q
let/constdan farqli o'laroq, var o'zgaruvchisi bloklarni (agar blok funksiya bo'lmasa) e'tiborsiz qoldiradi. U blok ichida e'lon qilinsa ham, blokdan tashqarida ham ko'rinadi:
Agar var o'rniga let ishlatilganda edi, tashqaridagi console.log(test) xatolik berardi. Xuddi shu narsa for siklida ham sodir bo'ladi:
var ning ko'lami faqat funksiya yoki butun skript darajasida bo'ladi. Oddiy { } bloklar, if, for uni cheklamaydi. Bu ko'pincha kutilmagan xatolarga olib keladi.Funksiya ichida esa var tashqariga chiqmaydi โ bu yerda u odatdagidek cheklanadi:
2-farq: hoisting (yuqoriga ko'tarilish)
var e'lonlari funksiya (yoki skript) boshiga "ko'tariladi" โ bu hoisting deb ataladi. Ya'ni o'zgaruvchini e'lon qilishdan oldin ishlatsangiz ham xatolik bo'lmaydi โ u undefined bo'ladi:
Nima sodir bo'ldi? JavaScript kodni shunday "o'qiydi": var phrase e'loni funksiya boshiga ko'tariladi, ammo qiymat berish (= 'Salom') o'z joyida qoladi. Shuning uchun birinchi console.log da o'zgaruvchi bor, lekin hali qiymatsiz โ undefined.
var phrase; (yuqorida) va phrase = 'Salom'; (o'z joyida) ga bo'linadi.let bilan esa bunday bo'lmaydi โ e'londan oldin ishlatish xatolik beradi ("temporal dead zone"). Bu aslida yaxshi โ xatoni yashirmasdan darhol ko'rsatadi.
3-farq: qayta e'lon qilishga ruxsat
Bir xil var o'zgaruvchisini bir necha marta qayta e'lon qilsa bo'ladi โ hech qanday xatolik chiqmaydi (bu ham xatolarni yashiradi):
let bilan bir xil o'zgaruvchini ikki marta e'lon qilish SyntaxError beradi โ bu tasodifiy nom to'qnashuvidan asraydi.
Nega hozir let/const afzal?
Yuqoridagi "o'ziga xosliklar" aslida var ning kamchiliklari. Ular kodni tushunishni qiyinlashtiradi va yashirin xatolarga sabab bo'ladi. let va const ularni to'g'irlaydi:
- Blok ko'lami โ o'zgaruvchi faqat kerak bo'lgan joyda yashaydi, tasodifan tarqalib ketmaydi;
- E'londan oldin ishlatib bo'lmaydi โ xatoni yashirmasdan darhol ko'rsatadi;
- Qayta e'lon qilib bo'lmaydi โ nom to'qnashuvi darhol aniqlanadi;
- const qiymat o'zgarmasligini kafolatlaydi โ kod niyati aniqroq bo'ladi.
constdan boshlang. Agar qiymat keyin o'zgarishi kerak bo'lsa โ letga o'ting. var ni esa yangi kodda umuman ishlatmaslik ma'qul.var hali ham ko'p uchraydi. Uni o'chirib tashlash shart emas, ammo uning xatti-harakatini bilishingiz kerak โ aks holda "nega bu o'zgaruvchi bu yerda ham bor?" degan chalkashlikka tushishingiz mumkin.Xulosa
varโ o'zgaruvchi e'lon qilishning eski usuli, hozir kamdan-kam ishlatiladi;- Uning blok ko'lami yo'q โ faqat funksiya yoki skript darajasida cheklanadi;
- Hoisting tufayli e'londan oldin ishlatilsa
undefinedbo'ladi (xatolik bermaydi); - Uni qayta e'lon qilsa bo'ladi โ bu xatolarni yashiradi;
- Yangi kodda const va let ishlatilishi kerak โ ular xavfsizroq va tushunarliroq.