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):
vardeklaruotas kintamasis pakeliamas į funkcijos pradžią. Tai reiškia, kad jį galima naudoti prieš deklaraciją, tačiau jo reikšmė tuo metu busundefined. - Netikėtas elgesys cikluose:
forcikluose, naudojant asinchronines operacijas (pvz.,setTimeout),vardeklaruotas 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ų.