Ozgaruvchanlar haqidagi birinchi bobda biz ozgaruvchanlarni elon qilishning uchta usulini eslatib otdik:
letconstvar
Leksik muhit uchun let va const bir xil yol 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 oxshash ish bajaradi. Yani, ozgaruvchanni elon 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 korinmaydi. Ammo var kod bloklarini etiborsiz qoldiradi, shuning uchun bizda global test mavjud.
Xuddi shu narsa tsiklar uchun: var blok-yoki tsikl-lokal bolishi 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 bolsa, var funktsiya darajasidagi ozgaruvchanga aylanadi:
function sayHi() {
if (true) {
var phrase = "Salom";
}
alert(phrase); // ishlaydi
}
sayHi();
alert(phrase); // ReferenceError: phrase is not defined
Korib turganimizdek, var if, for yoki boshqa kod bloklari orqali parchalanadi. Buning sababi shundaki, uzoq vaqt oldin JavaScript-ni bloklarida leksik muhit yoq edi. Va var bu uning qoldigi.
var funktsiya boshlanganda bajariladi
var deklaratsiyalari funktsiya boshlanganda bajariladi (yoki global uchun skript boshlanadi).
Boshqacha qilib aytganda, var ozgaruvchanlari funktsiya bajarilishidan boshlab, tarif qayerda bolishidan qati nazar (tarif 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 etiborga olinmaydi):
function sayHi() {
phrase = "Salom"; // (*)
if (false) {
var phrase;
}
alert(phrase);
}
sayHi();
Odamlar bunday xatti-harakatni hoisting (kotarish) deb ham atashadi, chunki barcha var funktsiyalarni yuqori qismiga yuzaga chiqadi (kotarilgan).
Shunday qilib, yuqoridagi misolda, if (false) shox hech qachon bajarilmaydi, ammo bu muhim emas. Uning ichidagi var funktsiya boshida bajariladi, shuning uchun (*) momentida ozgaruvchan mavjud.
Deklaratsiyalar kotariladi, ammo tayinlashlar yoq.
Buni quyidagi misol bilan namoyish qilish yaxshiroqdir:
function sayHi() {
alert(phrase);
var phrase = "Salom";
}
sayHi();
var phrase = "Salom" satrida ikkita amal mavjud:
- Ozgaruvchan deklaratsiya
var - Ozgaruvchan tayinlash
=
Deklaratsiya funktsiyani bajarish boshlanganda (kotarilgan) bajariladi, ammo tayinlash har doim paydo bolgan 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 ozgaruvchanlar tayinlanmaguncha aniqlanmagan.
Yuqoridagi ikkala misolda ham alert xatosiz ishlaydi, chunki phrase ozgaruvchani mavjud. Ammo uning qiymati hali tayinlanmagan, shuning uchun u undefined ni korsatadi.
Xulosa
var ning ikkita asosiy farqlari mavjud:
- Ozgaruvchanlar blok doirasiga ega emas, ular funktsiya darajasida minimal korinadi.
- Ozgaruvchan deklaratsiyalar funktsiya boshlanganda bajarilinadi.
Global obyekt bilan bogliq yana bir kichik farq bor, buni keyingi bobda korib chiqamiz.
Ushbu farqlar, aslida, kopincha yomon narsadir. Blok darajasidagi ozgaruvchanlar bu juda yaxshi narsa. Shuning uchun let standartga ancha oldin kiritilgan va endi ozgaruvchanni elon 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)