Sobes.tech
Junior

Ի՞նչ հետևանքների կարող է բերել փոփոխականի հայտարարումը `var` օգտագործելով ֆունկցիայի ներսում:

sobes.tech AI

Պատասխան AI-ից

Փոփոխականի հայտարարումը var-ով ֆունկցիայի ներսում ունի ֆունկցիոնալ տեսանելիության տարածք։ Դա նշանակում է, որ նման փոփոխականը հասանելի է ամբողջ ֆունկցիայի մեջ, անտեսելով բլոկային տարածքները (օրինակ, if կամ for ներսում):

Արդյունքները՝

  • Փոփոխականների վերագրում: var-ով հայտարարած փոփոխականը բլոկում կարող է վերագրել նույն անունով նախապես հայտարարած փոփոխականին, բայց դուրս այդ բլոկից:
  • Hoisting (բարձրացում): var-ով հայտարարած փոփոխականը բարձրացվում է ֆունկցիայի սկզբին։ Դա նշանակում է, որ կարող եք օգտագործել փոփոխականը նախքան նրա հայտարարությունը, բայց նրա արժեքը այդ պահին կլինի undefined:
  • Անսպասելի վարքագիծ ցիկլերում: for ցիկլերում, ինչպես նաև ասինխրոն գործողությունների (օրինակ, setTimeout) դեպքում, var-ով հայտարարած փոփոխականը կունենա վերջին արժեքը ցիկլից՝ բոլոր ասինխրոն callback-ների համար, ոչ թե այն արժեքը, որը եղել է իտերացիայի ժամանակ:

Նմուշ՝ բարձրացման և վերագրումների:

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, որոնք ունեն բլոկային տարածք, որպեսզի կանխել անսպասելի իրավիճակներ։