Sobes.tech
Junior

Барои чӣ натиҷаҳо метавонад эълон кардани тағирёбанда бо истифода аз var дар дохили функсия оварда расонад?

sobes.tech AI

Ҷавоб аз AI

Эълон кардани тағйирёбандаи бо var дар дохили функсия дорои доираи функсионалӣ мебошад. Ин маъно дорад, ки чунин тағйирёбанда дар тамоми функсия дастрас аст, бо нодида гирифтани доираи блокӣ (масалан, дар дохили if ё for).

Асосҳо:

  • Навиштани тағйирёбандаҳо: Тасвире, ки бо var дар дохили блок эълон шудааст, метавонад тағйирёбандаи ҳамон номро, ки қаблан дар ҳамин функсия эълон шудааст, навиштани дубора кунад, аммо берун аз он блок.
  • Hoisting (баланд кардан): Эълон кардани тағйирёбандаи бо var ба оғози функсия баланд мешавад. Ин маъно дорад, ки шумо метавонед тағйирёбандаро пеш аз эълон кардан истифода баред, аммо арзиши он дар он лаҳза undefined хоҳад буд.
  • Ҳаводиси нодуруст дар циклҳо: Дар циклҳои for бо амалҳои асинхронӣ (масалан, setTimeout), тағйирёбандаи, ки бо var эълон шудааст, барои ҳама callbacks-и асинхронӣ арзиши охиринро мегирад, на арзиши дар вақти итерация.

Маслиҳат барои баланд кардан ва навиштани дубора:

function намунаиScopeVar() {
  console.log(a); // undefined (ба сабаби hoisting)
  var a = 10;
  if (true) {
    var a = 20; // Навиштани дубора тағйирёбандаи хориҷӣ 'a'
    console.log(a); // 20
  }
  console.log(a); // 20 (аз блоки if)
}

намунаиScopeVar();

Маслиҳат бо цикл ва амалҳои асинхронӣ:

function намунаиЦиклVar() {
  for (var i = 0; i < 3; i++) {
    setTimeout(function() {
      console.log(i); // 3, 3, 3 мебарорад (i арзиши охиринро дорад)
    }, 100);
  }
}

намунаиЦиклVar();

Бо сабаби ин хусусиятҳо, тавсия дода мешавад, ки let ё const истифода шавад, ки доираи блокӣ доранд, барои пешгирии ҳолатҳои нодуруст.