نطاق المتغيرات
تعرف كيف تعلن متغيرات وتكتب دوالًا وتُرجع قيمًا. هناك قاعدة أخرى: النطاق — من هنا، أي الأسماء مسموح باستخدامها؟
ماذا يعني النطاق
النطاق هو المنطقة في البرنامج حيث يوجد الاسم. خارجها قد يختفي نفس الإملاء — أو يشير إلى ربط آخر. فكّر بغرفة: ملصق على جدار المطبخ واضح داخل المطبخ، لا يظهر تلقائيًا في الشارع.
ثلاثة أنواع يومية
📊 نطاق عام ودالّي وكتلي
| النوع | أين يعيش الاسم | أدوات شائعة | أين يُرى؟ |
|---|---|---|---|
| عام (global) | خارج كل الدوال | let / const / var في المستوى الأعلى |
عبر السكربت (نفس الصفحة) |
| محلي للدالة | داخل جسم الدالة | المعاملات والمحليات | داخل تلك الدالة فقط |
| كتلي | داخل { } مثل if أو حلقة |
let و const |
داخل تلك الكتلة فقط |
هذه الثلاثة تغطي أغلب كود المبتدئين. المحليات تبقى خاصة. ربطات الكتلة بـ let و const تبقى داخل الأقواس. العام مشترك — مفيد لعداد مشترك، وخطر إن صار كل اسم عامًا.
let city = "Tehran";
function showCity() {
console.log(city);
}
showCity();
console.log(city);
الأسماء العامة خارج الدوال
city معلَن في المستوى الأعلى، فتقرأه الدالة وconsole.log اللاحق. غيّر السلسلة مرة؛ كل قارئ يرى القيمة الجديدة. فضّل العام فقط عندما تتشارك أجزاء عدة قيمة واحدة حقًا.
function greet() {
let message = "Hello";
console.log(message);
}
greet();
// console.log(message); // Error: message is not defined
المحليات تبقى داخل الدالة
message موجود فقط أثناء تشغيل greet. خارجه الاسم غير معرَّف. المعاملات كذلك: محلية للدالة التي تدرجها.
if (true) {
let score = 10;
console.log(score);
}
// console.log(score); // Error: score is not defined
let و const يحترمان الكتل
داخل { }، ربط let أو const مرئي في تلك الكتلة فقط. بعد القوس المغلق يختفي score. أما var القديم فنطاقه دالّي وقد «يتسرب» من الكتلة. فضّل let و const حتى تعني حافة الكتلة ما تراه.
let title = "Shop";
function show() {
let label = "open";
console.log(title + " is " + label);
}
show();
المتداخل ينظر إلى الخارج
show يقرأ title الخارجي وlabel الخاص به. البحث يسير للخارج حتى يجد تطابقًا. لا يسير للداخل: الكود الخارجي لا يرى اسمًا وُلد داخل الدالة فقط.
let status = "ok";
function check() {
let status = "busy";
console.log(status);
}
check();
console.log(status);
التظليل: الداخل يفوز داخل الدالة
داخل check يخفي status المحلي الخارجي. الاستدعاء يطبع busy. بعد انتهاء الدالة يبقى الخارجي ok. نفس الإملاء، ربطان — النطاق يقرر أيهما تلمس.
اعرض قيمة ذات نطاق على الصفحة
احتفظ بتسمية عامة، ابنِ سطرًا داخل دالة ما زالت تقرأها، واكتب النتيجة في فقرة.
<!DOCTYPE html>
<html>
<head>
<title>scope — page</title>
</head>
<body>
<p id="msg">…</p>
<script>
let place = "Garden";
function line() {
let state = "open";
return place + " is " + state;
}
let box = document.getElementById("msg");
box.textContent = line();
</script>
</body>
</html>
الفقرة تعرض Garden is open. place عام؛ state محلي لـ line. الدالة تقرأ الاثنين وتُرجع سلسلة واحدة والصفحة تعرضها. غيّر place فقط، حدّث، وشاهد السطر. الدرس التالي الإغلاقات (closures) — دوال تبقي أسماء خارجية حيّة بعد انتهاء الاستدعاء الخارجي.
خطوات التمرين
- أعلن
let app = "demo"عامًا وسجّله من دالة صغيرة ومن الخارج. - ضع
let secret = 1داخل دالة؛ تأكد أن تسجيلsecretخارجها يرمي خطأ. - داخل
if (true) { }أعلنlet n = 5وسجّله؛ جرّب بعد الكتلة. - من دالة متداخلة اقرأ
letخارجيًا دون إعادة إعلان. - ظلّل
let tag = "A"الخارجي بـlet tag = "B"داخلي وسجّل الموضعين. - في عرض HTML غيّر سلسلة
placeفقط، حدّث، واقرأ الفقرة.
أخطاء شائعة
- استخدام اسم محلي خارج دالته — ReferenceError لا فراغ صامت
- توقّع أن يبقى
varداخل كتلة خاصًا مثلlet - افتراض أن الكود الخارجي يرى أسماء وُلدت فقط داخل دالة متداخلة
- خلط النطاق مع
return— الأول رؤية، والثاني إرسال قيمة - توقّع درس closures كامل هنا — إبقاء الأسماء بعد انتهاء الاستدعاء في الصفحة التالية
الخلاصة
- النطاق هو أين يُرى الاسم ويُستخدم
- العام خارج الدوال ومشترك عبر السكربت
- المحليات والمعاملات تبقى داخل دالتها
letوconstداخل{ }نطاق كتلي؛ أفضل منvarالمتسرب- المتداخل قد يقرأ للخارج؛ الخارجي لا يرى الأسماء الداخلية فقط
- الربط الداخلي بنفس الاسم يظلل الخارجي
- تحديث الصفحة يمكن أن يجمع عامًا ومحليًا في سلسلة مُرجَعة
- التالي: closures — دوال تتذكر الأسماء الخارجية
🧠 اختبر معرفتك
اختبر معرفتك
تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع
📝 التعليمات
- اقرأ كل سؤال بعناية
- اختر أفضل إجابة لكل سؤال
- يمكنك إعادة الاختبار عدة مرات كما تريد
- سيتم عرض تقدمك في الأعلى