Sobes.tech
Junior

Kokias pasekmes gali turėti kintamojo deklaravimas naudojant var funkcijos viduje?

sobes.tech AI

Atsakymas iš AI

Funkcijos viduje var deklaruotas kintamasis turi funkcijos apimtį. Tai reiškia, kad toks kintamasis yra prieinamas visoje funkcijoje, nepaisant blokų apimčių (pavyzdžiui, if ar for).

Padariniai:

  • Kintamųjų perrašymas: Bloke, kuriame deklaruotas var, esantis kintamasis gali perrašyti tą patį pavadinimą turintį anksčiau deklaruotą kintamąjį toje pačioje funkcijoje, bet neblokuojant.
  • Hoisting (pakėlimas): var deklaruotas kintamasis pakeliamas į funkcijos pradžią. Tai reiškia, kad jį galima naudoti prieš deklaraciją, tačiau jo reikšmė tuo metu bus undefined.
  • Netikėtas elgesys cikluose: for cikluose, naudojant asinchronines operacijas (pvz., setTimeout), var deklaruotas kintamasis turės paskutinę ciklo reikšmę visiems asinchroniniams callback'ams, o ne tą, kuri buvo iteracijos metu.

Pavyzdys pakėlimo ir perrašymo:

function pavyzdysScopeVar() {
  console.log(a); // undefined (dėl hoisting)
  var a = 10;
  if (true) {
    var a = 20; // Perrašo išorinį `a`
    console.log(a); // 20
  }
  console.log(a); // 20 (iš if bloko)
}

pavyzdysScopeVar();

Pavyzdys su ciklu ir asinchroninėmis operacijomis:

function pavyzdysCiklasVar() {
  for (var i = 0; i < 3; i++) {
    setTimeout(function() {
      console.log(i); // Išves 3, 3, 3 (i turi paskutinę reikšmę)
    }, 100);
  }
}

pavyzdysCiklasVar();

Dėl šių savybių rekomenduojama naudoti let arba const, kurie turi blokinę apimtį, siekiant išvengti netikėtų situacijų.