Sobes.tech
Junior

Kādas sekas var radīt mainīgā deklarēšana, izmantojot var funkcijas iekšienē?

sobes.tech AI

Atbilde no AI

Mainīgo deklarēšana ar var funkcijas iekšienē ir funkcijas līmeņa redzamības. Tas nozīmē, ka tāds mainīgais ir pieejams visā funkcijā, ignorējot bloka līmeņa redzamību (piemēram, iekš if vai for).

Sekas:

  • Mainīgo pārrakstīšana: Mainīgais, kas deklarēts ar var blokā, var pārrakstīt tādu pašu nosaukumu iepriekš deklarētu mainīgo tajā pašā funkcijā, bet ārpus šī bloka.
  • Pacelšana (Hoisting): Mainīgā deklarācija ar var tiek pacelta funkcijas sākumā. Tas nozīmē, ka var izmantot mainīgo pirms tās deklarēšanas, bet tās vērtība brīdī, kad to izmanto, būs undefined.
  • Negaidīta uzvedība ciklos: for ciklos ar asīnhroniskām operācijām (piemēram, setTimeout) mainīgais, kas deklarēts ar var, būs pēdējā cikla vērtība visiem asīnhroniskajiem atgriezeniskajiem saziņām, nevis vērtība tajā brīdī, kad notika iterācija.

Piemērs ar pacelšanu un pārrakstīšanu:

function exampleVarScope() {
  console.log(a); // undefined (pateicoties hoisting)
  var a = 10;
  if (true) {
    var a = 20; // Pārraksta ārējo mainīgo 'a'
    console.log(a); // 20
  }
  console.log(a); // 20 (vērtība no `if` bloka)
}

exampleVarScope();

Piemērs ar ciklu un asīnhroniskām operācijām:

function varLoopExample() {
  for (var i = 0; i < 3; i++) {
    setTimeout(function() {
      console.log(i); // Izvadīs 3, 3, 3 (i ir pēdējā vērtība no cikla)
    }, 100);
  }
}

varLoopExample();

Sakarā ar šīm īpatnībām, lai novērstu neparedzētas situācijas, ieteicams izmantot let vai const, kuriem ir bloka līmeņa redzamība.