Sobes.tech
Junior

ფუნქციის შიგნით var-ის გამოყენებით ცვლადის გამოცხადება რა შედეგებს შეიძლება გამოიწვიოს?

sobes.tech AI

პასუხი AI-სგან

ფუნქციის შიგნით var-ით გამოცხადებული ცვლადი ფუქციონალური სავალდებულო ზონით არის განსაზღვრული. ეს ნიშნავს, რომ ასეთი ცვლადი ხელმისაწვდომია მთელი ფუნქციის განმავლობაში, უგულებელყოფს ბლოკის ზონებს (მაგალითად, if ან for).

შედეგები:

  • ცვლადების გადაწერა: ბლოკში გამოცხადებული var-ით ცვლადი შეიძლება გადაწეროს იგივე სახელის მქონე ცვლადს, რომელიც ადრე იყო გამოცხადებული იმავე ფუნქციაში, მაგრამ ამ ბლოკის გარეთ.
  • Hoisting (მაღლა აწევა): var-ით გამოცხადებული ცვლადი აწევა ხდება ფუნქციის დასაწყისში. ეს ნიშნავს, რომ შეგიძლიათ გამოიყენოთ ცვლადი მის გამოცხადებამდე, მაგრამ მისი მნიშვნელობა ამ დროს იქნება undefined.
  • უცნაური ქცევა ციკლებში: for ციკლში, სადაც ასინქრონული ოპერაციებია (მაგალითად, setTimeout), var-ით გამოცხადებული ცვლადი მიიღებს ციკლის ბოლო მნიშვნელობას ყველა ასინქრონულ callback-თვის, არა იმ მნიშვნელობას, რომელიც იყო იმიტერაციის დროს.

მოჩვენებელი ზემოთ აწევა და გადაწერა:

ფუნქცია მაგალითიScopeVar() {
  console.log(a); // undefined (hoisting-ის გამო)
  var a = 10;
  თუ (true) {
    var a = 20; // გადაწერა გარედან `a` ცვლადს
    console.log(a); // 20
  }
  console.log(a); // 20 (if-ის ბლოკიდან მიღებული მნიშვნელობა)
}

მაგალითიScopeVar();

ციკლთან და ასინქრონულ ოპერაციებთან მაგალითი:

ფუნქცია მაგალითიЦикლVar() {
  for (var i = 0; i < 3; i++) {
    setTimeout(function() {
      console.log(i); // გამოიტანს 3, 3, 3 (i-ს ბოლო მნიშვნელობა)
    }, 100);
  }
}

მაგალითიЦикლVar();

ამ თვისებების გამო, რეკომენდირებულია გამოყენება let ან const, რომლებიც ბლოკის ზონას ფლობენ, რათა თავიდან აიცილოთ გაუთვალისწინებელი სიტუაციები.