جاري التحميل...

نطاق المتغيرات

تعرف كيف تعلن متغيرات وتكتب دوالًا وتُرجع قيمًا. هناك قاعدة أخرى: النطاق — من هنا، أي الأسماء مسموح باستخدامها؟

ماذا يعني النطاق

النطاق هو المنطقة في البرنامج حيث يوجد الاسم. خارجها قد يختفي نفس الإملاء — أو يشير إلى ربط آخر. فكّر بغرفة: ملصق على جدار المطبخ واضح داخل المطبخ، لا يظهر تلقائيًا في الشارع.

ثلاثة أنواع يومية

📊 نطاق عام ودالّي وكتلي

النوع أين يعيش الاسم أدوات شائعة أين يُرى؟
عام (global) خارج كل الدوال let / const / var في المستوى الأعلى عبر السكربت (نفس الصفحة)
محلي للدالة داخل جسم الدالة المعاملات والمحليات داخل تلك الدالة فقط
كتلي داخل { } مثل if أو حلقة let و const داخل تلك الكتلة فقط

هذه الثلاثة تغطي أغلب كود المبتدئين. المحليات تبقى خاصة. ربطات الكتلة بـ let و const تبقى داخل الأقواس. العام مشترك — مفيد لعداد مشترك، وخطر إن صار كل اسم عامًا.

اسم عام

javascript
let city = "Tehran";
function showCity() {
console.log(city);
}
showCity();
console.log(city);

الأسماء العامة خارج الدوال

city معلَن في المستوى الأعلى، فتقرأه الدالة وconsole.log اللاحق. غيّر السلسلة مرة؛ كل قارئ يرى القيمة الجديدة. فضّل العام فقط عندما تتشارك أجزاء عدة قيمة واحدة حقًا.

اسم محلي داخل دالة

javascript
function greet() {
let message = "Hello";
console.log(message);
}
greet();
// console.log(message); // Error: message is not defined

المحليات تبقى داخل الدالة

message موجود فقط أثناء تشغيل greet. خارجه الاسم غير معرَّف. المعاملات كذلك: محلية للدالة التي تدرجها.

نطاق كتلي مع let

javascript
if (true) {
let score = 10;
console.log(score);
}
// console.log(score); // Error: score is not defined

let و const يحترمان الكتل

داخل { }، ربط let أو const مرئي في تلك الكتلة فقط. بعد القوس المغلق يختفي score. أما var القديم فنطاقه دالّي وقد «يتسرب» من الكتلة. فضّل let و const حتى تعني حافة الكتلة ما تراه.

الكود المتداخل يقرأ للخارج

javascript
let title = "Shop";
function show() {
let label = "open";
console.log(title + " is " + label);
}
show();

المتداخل ينظر إلى الخارج

show يقرأ title الخارجي وlabel الخاص به. البحث يسير للخارج حتى يجد تطابقًا. لا يسير للداخل: الكود الخارجي لا يرى اسمًا وُلد داخل الدالة فقط.

الاسم الداخلي يظلل الخارجي

javascript
let status = "ok";
function check() {
let status = "busy";
console.log(status);
}
check();
console.log(status);

التظليل: الداخل يفوز داخل الدالة

داخل check يخفي status المحلي الخارجي. الاستدعاء يطبع busy. بعد انتهاء الدالة يبقى الخارجي ok. نفس الإملاء، ربطان — النطاق يقرر أيهما تلمس.

اعرض قيمة ذات نطاق على الصفحة

احتفظ بتسمية عامة، ابنِ سطرًا داخل دالة ما زالت تقرأها، واكتب النتيجة في فقرة.

عرض الصفحة مع النطاق

html
<!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) — دوال تبقي أسماء خارجية حيّة بعد انتهاء الاستدعاء الخارجي.

خطوات التمرين

  1. أعلن let app = "demo" عامًا وسجّله من دالة صغيرة ومن الخارج.
  2. ضع let secret = 1 داخل دالة؛ تأكد أن تسجيل secret خارجها يرمي خطأ.
  3. داخل if (true) { } أعلن let n = 5 وسجّله؛ جرّب بعد الكتلة.
  4. من دالة متداخلة اقرأ let خارجيًا دون إعادة إعلان.
  5. ظلّل let tag = "A" الخارجي بـ let tag = "B" داخلي وسجّل الموضعين.
  6. في عرض HTML غيّر سلسلة place فقط، حدّث، واقرأ الفقرة.

أخطاء شائعة

  • استخدام اسم محلي خارج دالته — ReferenceError لا فراغ صامت
  • توقّع أن يبقى var داخل كتلة خاصًا مثل let
  • افتراض أن الكود الخارجي يرى أسماء وُلدت فقط داخل دالة متداخلة
  • خلط النطاق مع return — الأول رؤية، والثاني إرسال قيمة
  • توقّع درس closures كامل هنا — إبقاء الأسماء بعد انتهاء الاستدعاء في الصفحة التالية

الخلاصة

  • النطاق هو أين يُرى الاسم ويُستخدم
  • العام خارج الدوال ومشترك عبر السكربت
  • المحليات والمعاملات تبقى داخل دالتها
  • let و const داخل { } نطاق كتلي؛ أفضل من var المتسرب
  • المتداخل قد يقرأ للخارج؛ الخارجي لا يرى الأسماء الداخلية فقط
  • الربط الداخلي بنفس الاسم يظلل الخارجي
  • تحديث الصفحة يمكن أن يجمع عامًا ومحليًا في سلسلة مُرجَعة
  • التالي: closures — دوال تتذكر الأسماء الخارجية

🧠 اختبر معرفتك

جاهز للبدء

اختبر معرفتك

تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع

❓
8
الأسئلة
🎯
70%
للنجاح
♾️
∞
الوقت
🔄
∞
المحاولات

📝 التعليمات

  • اقرأ كل سؤال بعناية
  • اختر أفضل إجابة لكل سؤال
  • يمكنك إعادة الاختبار عدة مرات كما تريد
  • سيتم عرض تقدمك في الأعلى