# مفهوم “let” في JavaScript
تُعتبر “let” واحدة من الطرق الثلاثة لتعريف المتغيرات في JavaScript، إلى جانب “var” و”const”. تم تقديم “let” في الإصدار السادس من معيار ECMAScript (ES6) لتوفير طريقة أكثر دقة وأمانًا لتعريف المتغيرات، مع تحسينات تتعلق بنطاق المتغيرات ومرونة الاستخدام.
## الفرق بين “let” و “var”
### 1. النطاق (Scope)
– **let**: المتغيرات المعرفة باستخدام “let” لها نطاق كتلة (block scope)، مما يعني أنها صالحة فقط ضمن الكتلة التي تم تعريفها فيها. الكتلة تُعرف عادة بين الأقواس المعقوفة `{}`، مثل تلك المستخدمة في الجمل الشرطية أو الحلقات.
– **var**: المتغيرات المعرفة باستخدام “var” لها نطاق دالة (function scope)، مما يعني أنها صالحة ضمن الدالة التي تم تعريفها فيها، أو في حالة عدم وجود دالة، فإنها تكون صالحة في النطاق العام (global scope).
### 2. إعادة التعريف
– **let**: لا يمكن إعادة تعريف المتغيرات المعرفة باستخدام “let” في نفس النطاق.
– **var**: يمكن إعادة تعريف المتغيرات المعرفة باستخدام “var” في نفس النطاق دون حدوث أي خطأ.
### 3. الاستضافة (Hoisting)
– **let**: المتغيرات المعرفة باستخدام “let” يتم [شركة برمجة مصرية] استضافتها على مستوى النطاق ولكنها لا تُهيّأ (initialize) إلا عند الوصول إلى السطر الذي يُعرّفها، مما يعني أنك ستحصل على خطأ إذا حاولت الوصول إليها قبل تعريفها.
– **var**: المتغيرات المعرفة باستخدام “var” تُستضاف وتُهيّأ إلى `undefined`، لذا يمكن الوصول إليها قبل تعريفها ولكنها ستكون غير معرفة (undefined).
## أمثلة توضح استخدام “let”
### مثال 1: النطاق الكتلي
if (true) {
let x = 10;
console.log(x); // 10
}
console.log(x); // ReferenceError: x is not defined
في هذا المثال، المتغير `x` معرف باستخدام “let” داخل الكتلة الشرطية، لذا فهو غير مرئي خارج هذه الكتلة.
### مثال 2: إعادة التعريف
let y = 5;
// let y = 10; // SyntaxError: Identifier 'y' has already been declared
y = 10; // هذا صحيح، يمكن تغيير القيمة
console.log(y); // 10
لا يمكن إعادة تعريف المتغير `y` باستخدام “let” في نفس النطاق، لكن يمكن تغيير قيمته.
### مثال 3: الاستضافة
console.log(z); // ReferenceError: Cannot access 'z' before initialization
let z = 20;
المتغير `z` معرف باستخدام “let”، ويؤدي الوصول إليه قبل تهيئته إلى خطأ.
### مثال 4: استخدام “let” في حلقات
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 100);
}
// يطبع: 0, 1, 2 بعد 100 ميلي ثانية
بما أن “let” يحدد النطاق لكل تكرار في الحلقة، فإن القيم المطبوعة ستكون 0، 1، 2 كما [شركة برمجة مصرية] هو متوقع، على عكس “var” التي قد تؤدي إلى طباعة نفس الرقم.
## الخلاصة
استخدام “let” في JavaScript يوفر العديد من المزايا المتعلقة بإدارة النطاق ومنع إعادة تعريف المتغيرات عن طريق الخطأ. يساعد في كتابة كود أكثر أمانًا ووضوحًا، وهو الآن الخيار المفضل لتعريف المتغيرات عند الحاجة إلى تغيير القيم.
