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ā¦)