Oâzgaruvchanlar haqidagi birinchi bobda biz oâzgaruvchanlarni eâlon qilishning uchta usulini eslatib oâtdik:
letconstvar
Leksik muhit uchun let va const bir xil yoâl tutishadi.
Ammo var â bu juda qadimgi zamonlardan kelib chiqqan juda boshqacha jonzod. Odatda zamonaviy skriptlarda ishlatilmaydi, ammo baribir eskilarida yashiringan.
Agar siz bunday skriptlar bilan tanishishni rejalashtirmasangiz, ushbu bobdan voz kechishingiz yoki uni kechiktirishingiz mumkin, ammo keyinroq sizni tishlab qolish ehtimoli bor.
Birinchi qarashdanoq, var let ga oâxshash ish bajaradi. Yaâni, oâzgaruvchanni eâlon qiladi:
function sayHi() {
var phrase = "Salom"; // mahalliy o'zgaruvchan, "let" o'rniga "var"
alert(phrase); // Salom
But internally `var` is a very different beast, that originates from very old times. It's generally not used in modern scripts, but still lurks in the old ones.
If you don't plan on meeting such scripts you may even skip this chapter or postpone it.
...Ammo bu yerda farqlar mavjud.
## "var" blok doirasiga ega emas
`var` o'zgaruvchanlari funktsiya miqyosida yoki global bo'lib, ular bloklar orqali ko'rinadi.
Masalan:
```js run
if (true) {
var test = true; // "let" o'rniga "var" ishlatildi
}
alert(test); // true, o'zgaruvchanni if dan keyin yashaydi
Agar biz 2-satrda let test dan foydalansak, u holda alert koârinmaydi. Ammo var kod bloklarini eâtiborsiz qoldiradi, shuning uchun bizda global test mavjud.
Xuddi shu narsa tsiklar uchun: var blok-yoki tsikl-lokal boâlishi mumkin emas:
for (var i = 0; i < 10; i++) {
var one = 1;
// ...
}
alert(i); // 10, "i" tsikldan keyin ko'rinadi, bu global o'zgaruvchandir
Agar kod bloki funktsiya ichida boâlsa, var funktsiya darajasidagi oâzgaruvchanga aylanadi:
function sayHi() {
if (true) {
var phrase = "Salom";
}
alert(phrase); // ishlaydi
}
sayHi();
alert(phrase); // ReferenceError: phrase is not defined
Koârib turganimizdek, var if, for yoki boshqa kod bloklari orqali parchalanadi. Buning sababi shundaki, uzoq vaqt oldin JavaScript-ni bloklarida leksik muhit yoâq edi. Va var â bu uning qoldigâi.
âvarâ funktsiya boshlanganda bajariladi
var deklaratsiyalari funktsiya boshlanganda bajariladi (yoki global uchun skript boshlanadi).
Boshqacha qilib aytganda, var oâzgaruvchanlari funktsiya bajarilishidan boshlab, taârif qayerda boâlishidan qatâi nazar (taârif ichki funktsiyada emas deb taxmin qilinadi).
Shunday qilib, ushbu kod:
function sayHi() {
phrase = "Salom";
alert(phrase);
var phrase;
}
sayHi();
â¦Texnik jihatdan shu bilan bir xil (yuqoridagi var phrase):
function sayHi() {
var phrase;
phrase = "Salom";
alert(phrase);
}
sayHi();
â¦Yoki shunday (esda tutingki, kod bloklari eâtiborga olinmaydi):
function sayHi() {
phrase = "Salom"; // (*)
if (false) {
var phrase;
}
alert(phrase);
}
sayHi();
Odamlar bunday xatti-harakatni âhoistingâ (koâtarish) deb ham atashadi, chunki barcha var funktsiyalarni yuqori qismiga âyuzaga chiqadiâ (koâtarilgan).
Shunday qilib, yuqoridagi misolda, if (false) shox hech qachon bajarilmaydi, ammo bu muhim emas. Uning ichidagi var funktsiya boshida bajariladi, shuning uchun (*) momentida oâzgaruvchan mavjud.
Deklaratsiyalar koâtariladi, ammo tayinlashlar yoâq.
Buni quyidagi misol bilan namoyish qilish yaxshiroqdir:
function sayHi() {
alert(phrase);
var phrase = "Salom";
}
sayHi();
var phrase = "Salom" satrida ikkita amal mavjud:
- Oâzgaruvchan deklaratsiya
var - Oâzgaruvchan tayinlash
=
Deklaratsiya funktsiyani bajarish boshlanganda (âkoâtarilganâ) bajariladi, ammo tayinlash har doim paydo boâlgan joyda ishlaydi. Shunday qilib kod asosan shunday ishlaydi:
function sayHi() {
var phrase; // deklaratsiya boshida ishlaydi...
alert(phrase); // undefined
phrase = "Hello"; // ...tayinlash - ijro etilishi unga yetganda.
}
sayHi();
Barcha var deklaratsiyalari funktsiya boshlanganda bajarilganligi sababli, biz ularga istalgan joyda murojaat qilishimiz mumkin. Ammo oâzgaruvchanlar tayinlanmaguncha aniqlanmagan.
Yuqoridagi ikkala misolda ham alert xatosiz ishlaydi, chunki phrase oâzgaruvchani mavjud. Ammo uning qiymati hali tayinlanmagan, shuning uchun u undefined ni koârsatadi.
Xulosa
var ning ikkita asosiy farqlari mavjud:
- Oâzgaruvchanlar blok doirasiga ega emas, ular funktsiya darajasida minimal koârinadi.
- Oâzgaruvchan deklaratsiyalar funktsiya boshlanganda bajarilinadi.
Global obyekt bilan bogâliq yana bir kichik farq bor, buni keyingi bobda koârib chiqamiz.
Ushbu farqlar, aslida, koâpincha yomon narsadir. Blok darajasidagi oâzgaruvchanlar â bu juda yaxshi narsa. Shuning uchun let standartga ancha oldin kiritilgan va endi oâzgaruvchanni eâlon qilishning asosiy usuli (const bilan birga).
Izohlar
<code>yorlig'ini ishlating, bir nechta satrlar uchun - ularni<pre>yorlig'i bilan o'rab qo'ying, 10 satrdan ortiq bo'lsa - sandbox (plnkr, jsbin, codepenâ¦)