Sobes.tech
Junior

Към какви последствия може да доведе обявяването на променлива с използване на var вътре в функция?

sobes.tech AI

Отговор от AI

Обявяването на променлива с var вътре във функция има функционална област на видимост. Това означава, че такава променлива е достъпна във цялата функция, игнорирайки блоковите области на видимост (например вътре в if или for).

Последици:

  • Презаписване на променливи: Променлива, обявена с var в блок, може да презапише променлива с същото име, обявена по-рано в същата функция, но извън този блок.
  • Hoisting (повдигане): Обявяването на променлива с var се повдига в началото на функцията. Това означава, че може да използвате променливата преди нейното обявяване, но стойността ѝ към този момент ще бъде undefined.
  • Неочаквано поведение в цикли: В цикли for с асинхронни операции (например setTimeout), променливата, обявена с var, ще има последната стойност от цикъла за всички асинхронни обратни повиквания, а не стойността към момента на итерацията.

Пример за повдигане и презаписване:

function primerVarScope() {
  console.log(a); // undefined (заради hoisting)
  var a = 10;
  if (true) {
    var a = 20; // Презаписва външната променлива 'a'
    console.log(a); // 20
  }
  console.log(a); // 20 (стойността от блока if)
}

primerVarScope();

Пример с цикъл и асинхронни операции:

function primerCikълVar() {
  for (var i = 0; i < 3; i++) {
    setTimeout(function() {
      console.log(i); // Ще изведе 3, 3, 3 (i има последната стойност от цикъла)
    }, 100);
  }
}

primerCikълVar();

Поради тези особености, се препоръчва използването на let или const, които имат блокова област на видимост.