نطاق المتغيرات في JavaScript: var، let، const والدوال
مرحباً بالجميع! لقد بدأت للتو في تعلم JavaScript ولا أستطيع فهم نطاق المتغيرات. أكتب كوداً بسيطاً، لكن النتائج تفاجئني باستمرار.
إليكم مثالاً:
```javascript
var x = 10;
function test() {
var x = 20;
if (true) {
var x = 30;
console.log(x); // يطبع 30
}
console.log(x); // يطبع 30، وليس 20!
}
test();
console.log(x); // يطبع 10
```
لماذا داخل الدالة `test()` يتغير المتغير `x`، رغم أنني أعلنته باستخدام `var` داخل الكتلة `if`؟ كنت أعتقد أن `var` محدود بالدالة، لكنه يتصرف بشكل غريب هنا. أيضاً سمعت عن `let` و `const`، لكنني لا أفهم الفرق بينهما.
مثال آخر مع الإغلاقات (closures):
```javascript
for (var i = 0; i < 3; i++) {
setTimeout(function() {
console.log(i); // يطبع 3، 3، 3
}, 100);
}
```
لماذا تظهر جميع الاستدعاءات الثلاثة الرقم 3، وليس 0، 1، 2؟ كنت أتوقع أن كل استدعاء لـ setTimeout سيتذكر قيمته الخاصة من i. اشرحوا لي، من فضلكم، كيف يعمل هذا.