Avatar ·

نطاق المتغيرات في 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. اشرحوا لي، من فضلكم، كيف يعمل هذا.