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, რომლებიც ბლოკის ზონას ფლობენ, რათა თავიდან აიცილოთ გაუთვალისწინებელი სიტუაციები.