Sobes.tech
Junior

Funktsiya ichida var bilan o'zgaruvchi e'lon qilish qanday natijalarga olib kelishi mumkin?

sobes.tech AI

AIdan javob

Funktsiya ichida var bilan e'lon qilingan o'zgaruvchi funktsiya doirasiga ega. Bu shuni anglatadiki, bunday o'zgaruvchi butun funktsiya bo'ylab mavjud bo'lib, blok doiralari (masalan, if yoki for ichida) e'tiborga olinmaydi.

Natijalar:

  • O'zgaruvchilarni yozib olish: Blok ichida var bilan e'lon qilingan o'zgaruvchi, avvalroq shu funktsiyada e'lon qilingan, lekin blok tashqarisidagi o'zgaruvchini yozib olishi mumkin.
  • Hoisting (ko'tarilish): var bilan e'lon qilingan o'zgaruvchi funktsiya boshiga ko'tariladi. Bu shuni anglatadiki, o'zgaruvchini e'lon qilishdan oldin ham foydalanish mumkin, lekin uning qiymati o'sha vaqtda undefined bo'ladi.
  • Tsikllarda kutilmagan xulq: for tsikllarida, asinxron operatsiyalar bilan (masalan, setTimeout) var bilan e'lon qilingan o'zgaruvchi, barcha asinxron callbacklar uchun tsikl oxirgi qiymatini oladi, iteratsiya vaqtidagi emas.

Ko'tarilish va yozib olish misoli:

function misolVarDoira() {
  console.log(a); // undefined (hoisting sababli)
  var a = 10;
  if (true) {
    var a = 20; // Tashqi 'a' o'zgaruvchini yozib oladi
    console.log(a); // 20
  }
  console.log(a); // 20 (if blokidan olingan qiymat)
}

misolVarDoira();

Asinxron operatsiyalar va tsikl misoli:

function misolVarTsikl() {
  for (var i = 0; i < 3; i++) {
    setTimeout(function() {
      console.log(i); // 3, 3, 3 chiqaradi (i, tsikl oxirgi qiymati)
    }, 100);
  }
}

misolVarTsikl();

Ushbu xususiyatlar sababli, kutilmagan holatlarni oldini olish uchun, blok doirasiga ega bo'lgan let yoki const dan foydalanish tavsiya etiladi.