النطاق (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 الحقيقية.