مقدمة عن الفرق ما بين الـ var و let و const

عند تعلم JavaScript ستجد نفسك كثيرًا ما تحتاج إلى تعريف المتغيرات (Variables). ومع تطور اللغة عبر السنوات، أصبح لدينا ثلاث طرق أساسية للتصريح عن المتغيرات: var و let و const. وقد يختلط الأمر على الكثير من المبرمجين المبتدئين حول متى يستخدم كل واحد منها وما هو الفرق بينهم.

1. ما هو var؟

  • التاريخ: var هي الطريقة القديمة والأصلية لتعريف المتغيرات في JavaScript منذ بداياتها.
  • النطاق (Scope): المتغيرات المعرفة باستخدام var لها function scope، أي تكون متاحة في كامل الدالة التي عُرفت داخلها.
  • إعادة التعريف: يمكن إعادة تعريف نفس المتغير أكثر من مرة باستخدام var بدون مشاكل.

مثال:

var name = "Ali";
var name = "Omar"; // لا يوجد خطأ
console.log(name); // Omar

2. ما هو let؟

  • التاريخ: تمت إضافته في ES6 (سنة 2015) لتحسين التعامل مع المتغيرات.
  • النطاق (Scope): المتغيرات المعرفة بـ let لها block scope، أي تكون متاحة فقط داخل { } التي عُرفت فيها.
  • إعادة التعريف: لا يمكن إعادة تعريف نفس المتغير داخل نفس النطاق.

مثال:

let age = 20;
age = 25; // ممكن نغيّر القيمة
// let age = 30; ❌ خطأ: لا يمكن إعادة تعريف نفس المتغير في نفس النطاق
console.log(age); // 25

3. ما هو const؟

  • الوظيفة: يستخدم لتعريف متغيرات ثابتة القيمة (لا يمكن تغييرها).
  • النطاق (Scope): مثل let، له block scope.
  • إعادة التعيين: لا يمكن تغيير قيمة المتغير بعد تعريفه.

مثال:

const pi = 3.14;
// pi = 3.14159; ❌ خطأ: لا يمكن تغيير القيمة
console.log(pi); // 3.14

⚠️ ملاحظة مهمة: إذا كان المتغير عبارة عن Object أو Array، فإن const تمنعك من إعادة إسناد متغير جديد، لكنها لا تمنع تعديل المحتوى الداخلي.

مثال:

const user = { name: "Ali" };
user.name = "Omar"; // ✅ مسموح
console.log(user); // { name: "Omar" }

4. جدول مقارنة سريع

الخاصية var let const
نطاق المتغير (Scope) Function Scope (متاح فقط داخل الدالة) Block Scope (داخل الأقواس {} فقط) Block Scope (داخل الأقواس {} فقط)
إعادة التعريف (Redeclare) ✅ ممكن إعادة تعريفه في نفس النطاق ❌ غير ممكن ❌ غير ممكن
إعادة الإسناد (Reassign) ✅ مسموح ✅ مسموح ❌ غير مسموح
التهيئة (Initialization) ممكن تعريفه بدون قيمة ممكن تعريفه بدون قيمة يجب إعطاؤه قيمة عند التعريف
الرفع (Hoisting) يتم رفعه لأعلى الكود بقيمة undefined يتم رفعه لكن لا يمكن استخدامه قبل التعريف (Temporal Dead Zone) يتم رفعه لكن لا يمكن استخدامه قبل التعريف (Temporal Dead Zone)
الأمان في الكود أقل أمانًا ويسبب مشاكل أكثر أمانًا الأكثر أمانًا

5. متى تستخدم كل واحد؟

  • استخدم const بشكل افتراضي دائمًا إذا لم تكن بحاجة لتغيير القيمة.
  • استخدم let عندما تحتاج متغير يمكن تغيير قيمته.
  • تجنب استخدام var إلا في حالات نادرة أو عند التعامل مع كود قديم جدًا.

الخلاصة

  • var قديم ويعمل على مستوى الدالة.
  • let و const أحدث وأكثر أمانًا ويعملان على مستوى البلوك.
  • القاعدة الذهبية: ابدأ دائمًا بـ const، وإذا احتجت تغيّر القيمة استخدم let.