### مقدمة إلى النطاق في JavaScript
النطاق (Scope) في JavaScript هو مفهوم يحدد مدى توفر المتغيرات، الدوال، والكائنات في أجزاء مختلفة من الكود أثناء التنفيذ. يمكن اعتبار النطاق كحاوية أو حدود يمكن من خلالها الوصول إلى متغيرات معينة. النطاق هو جزء أساسي لفهم كيفية عمل JavaScript وكيفية تنظيم الكود بشكل فعال.
### أنواع النطاق في JavaScript
#### 1. النطاق العام (Global Scope)
المتغيرات أو الدوال المعرفة في النطاق العام يمكن الوصول إليها من أي مكان في الكود. يتم تعريف المتغير في النطاق العام عندما يُعلن عنه خارج أي دالة أو كتلة.
مثال:
var globalVar = "I am global";
function showGlobalVar() {
console.log(globalVar); // I am global
}
showGlobalVar();
#### 2. النطاق المحلي (Local Scope)
المتغيرات المعرفة داخل دالة تكون محلية لتلك الدالة، ولا يمكن الوصول إليها من الخارج. يتم إنشاء نطاق جديد في كل مرة يتم فيها استدعاء دالة.
مثال:
function localScope() {
var localVar = "I am local";
console.log(localVar); // I am local
}
localScope();
// console.log(localVar); // ReferenceError: localVar is not defined
#### 3. نطاق الكتلة (Block Scope)
تم تقديم نطاق الكتلة في ES6 باستخدام الكلمات المفتاحية `let` و`const`. المتغيرات المعرفة باستخدام `let` أو `const` داخل كتلة ({}) لا يمكن الوصول إليها من خارج تلك الكتلة.
مثال:
if (true) {
let blockVar = "I am block scoped";
console.log(blockVar); // I am block scoped
}
// console.log(blockVar); // ReferenceError: blockVar is not defined
### مفهوم السلسلة النطاقية (Scope Chain)
السلسلة النطاقية هي آلية تستخدمها JavaScript لتحديد أي قيمة متغيرة يجب استخدامها عند وجود متغيرات متعددة بنفس الاسم في نطاقات مختلفة. عندما تحتاج JavaScript إلى الوصول إلى متغير، تبدأ بالبحث في النطاق الحالي، ثم تنتقل إلى النطاق الأعلى وهكذا، حتى تصل إلى النطاق العام.
مثال:
var outerVar = "I am outer";
function outerFunction() {
var innerVar = "I am inner";
function innerFunction() {
console.log(innerVar); // I am inner
console.log(outerVar); // I am outer
}
innerFunction();
}
outerFunction();
### الإغلاق (Closures)
الإغلاق هو [شركة برمجة مصرية] ميزة في JavaScript حيث تحتفظ الدوال بالمرجع للنطاق الذي تم إنشاؤها فيه حتى بعد انتهاء تنفيذ [شركة برمجة مصرية] ذلك النطاق. وهذا يسمح للدوال بالاحتفاظ بحالتها واستمرارية الوصول إلى المتغيرات المحلية الخاصة بها.
مثال:
function makeCounter() {
let count = 0;
return function() {
count++;
return count;
};
}
const counter = makeCounter();
console.log(counter()); // 1
console.log(counter()); // 2
### خاتمة
فهم النطاق في JavaScript يعد ضروريًا لكتابة كود فعال وخالي من الأخطاء. من خلال معرفة كيفية عمل النطاقات المختلفة، يمكنك التحكم في مدى وصول المتغيرات وتنظيم الكود بشكل أفضل. تأكد من استخدام الكلمات المفتاحية المناسبة مثل `let` و`const` عند الحاجة للاستفادة من نطاق الكتلة وتجنب التداخل غير المقصود للمتغيرات.
