| الكلمة | النطاق | إعادة التعيين | إعادة التعريف |
|---|---|---|---|
| var | الدالة (Function Scope) | نعم | نعم (خطير) |
| let | الكتلة (Block Scope) | نعم | لا |
| const | الكتلة (Block Scope) | لا | لا |
المتغير (Variable) هو حاوية تُخزّن قيمة يمكن استخدامها لاحقاً في الكود. تمتلك جافاسكريبت ثلاث كلمات لتعريف المتغيرات: var القديمة، وlet وconst الحديثتان اللتان ظهرتا مع ES6 عام 2015 وأصبحتا المعيار الموصى به اليوم.
var لها نطاق دالة (Function Scope) فقط، ويمكن إعادة تعريفها عدة مرات بنفس الاسم دون خطأ، وتخضع لظاهرة الـ Hoisting بشكل قد يُسبب أخطاء غير متوقعة. لهذه الأسباب أصبح استخدامها غير مستحسن في الكود الحديث إلا للحفاظ على توافق مع كود قديم.
let لها نطاق كتلة (Block Scope) أي أنها محصورة داخل الأقواس {} التي عُرّفت فيها (شرط، حلقة، دالة)، ولا يمكن إعادة تعريفها بنفس الاسم في نفس النطاق، لكن يمكن تغيير قيمتها. تُستخدم عندما تتوقع أن القيمة ستتغير لاحقاً، مثل عداد في حلقة تكرارية.
const تعني "ثابت" (Constant) — لها نفس نطاق let لكن لا يمكن إعادة تعيين قيمتها بعد التعريف الأول أبداً. القاعدة الذهبية في JavaScript الحديثة: استخدم const دائماً كخيار افتراضي، وانتقل إلى let فقط إذا كنت متأكداً أن القيمة ستتغير. ملاحظة مهمة: const تمنع تغيير المتغير نفسه، لكن إذا كانت القيمة كائناً أو مصفوفة، يمكنك تعديل محتوياتها الداخلية بحرية.
| 1 | var قديم = "لا يُنصح باستخدامه"; // نطاق دالة، Hoisting |
| 2 | let قابل_للتغيير = "قيمة أولى"; // نطاق كتلة |
| 3 | const ثابت = "لا يتغير أبداً"; // نطاق كتلة، غير قابل لإعادة التعيين |
| 4 | |
| 5 | قابل_للتغيير = "قيمة جديدة"; // مسموح مع let |
| 6 | // ثابت = "خطأ"; // ❌ يرمي خطأ مع const |
مثال 1: let و const في التطبيق
| 1 | // الفرق بين let و const |
| 2 | let عمر = 25; |
| 3 | عمر = 26; // ✅ مسموح، القيمة تتغير |
| 4 | |
| 5 | const اسم = "محمد"; |
| 6 | // اسم = "أحمد"; // ❌ خطأ: Assignment to constant variable |
| 7 | |
| 8 | // const مع كائن: يمكن تعديل المحتوى وليس المتغير نفسه |
| 9 | const مستخدم = { اسم: "سارة" }; |
| 10 | مستخدم.اسم = "ليلى"; // ✅ مسموح تماماً |
مثال 2: مشكلة var مقابل let في نطاق الكتلة
| 1 | // مشكلة var الشهيرة: تسريب النطاق |
| 2 | if (true) { |
| 3 | var x = 10; |
| 4 | let y = 20; |
| 5 | } |
| 6 | console.log(x); // 10 — تسرّب خارج الشرط! |
| 7 | // console.log(y); // ❌ خطأ: y غير معرّف هنا |