The Code Fix

🟨 شرح جافاسكريبت

النطاق والإغلاق والدوال المتقدمة

النطاق (Scope)

النطاق يحدّد أين تكون المتغيّرات مرئية. ثلاثة أنواع:

let global = "عام";   // نطاق عام (متاح في كل مكان)

function test() {
  let local = "محلي"; // نطاق الدالة (متاح داخلها فقط)
  console.log(global); // ✅
}
console.log(local);    // ❌ خطأ: غير معرّف خارج الدالة

نطاق الكتلة مع let/const:

if (true) {
  let blockScoped = "داخل الكتلة";
}
console.log(blockScoped);  // ❌ غير متاح خارج {}

🔑 استخدم let وconst (نطاق كتلة) لا var (نطاق دالة، سلوك قديم مربك).

الدوال السهمية (Arrow Functions)

صياغة أقصر للدوال:

// تقليدية
function add(a, b) { return a + b; }

// سهمية
const add = (a, b) => a + b;

// معامل واحد
const square = x => x * x;

// بلا معاملات
const hello = () => "مرحبًا";

تتألّق مع دوال المصفوفات:

[1, 2, 3].map(n => n * 2);

الفرق المهم: الدالة السهمية لا تربط this خاصًّا بها — ترث this من محيطها (مهم في الكائنات والأحداث).

دوال رد النداء (Callbacks)

دالة تُمرَّر إلى دالة أخرى لتُستدعى لاحقًا:

function processUser(name, callback) {
  let greeting = "أهلًا " + name;
  callback(greeting);
}

processUser("براء", message => console.log(message));

الـ callbacks أساس البرمجة غير المتزامنة والأحداث.

الإغلاق (Closures) 🌟

دالة "تتذكّر" متغيّرات نطاقها الخارجي حتى بعد انتهائه:

function counter() {
  let count = 0;
  return function () {
    count++;
    return count;
  };
}

let increment = counter();
increment();   // 1
increment();   // 2  (تذكّرت count!)

الإغلاق يتيح "بيانات خاصة" وحالة محفوظة — مفهوم قوي جدًا في JS.

الأخطاء الشائعة

  • ❌ استخدام var → سلوك نطاق مربك؛ استخدم let/const.
  • ❌ استخدام دالة سهمية كـ method يحتاج this الكائن → استخدم دالة عادية.
  • ❌ الوصول لمتغيّر خارج نطاقه → خطأ "غير معرّف".

خلاصة

النطاق يحدّد رؤية المتغيّرات (فضّل let/const)، والدوال السهمية صياغة أقصر (لا تربط this)، والـ callbacks دوال تُمرَّر لتُستدعى لاحقًا، والإغلاق يجعل الدالة تتذكّر نطاقها — مفاهيم متقدّمة تفتح أبواب JS الحقيقية.