الدوال السهمية والنطاق في JavaScript
في الدرس السابق كتبنا الدوال بكلمة function. في JavaScript الحديثة ستجد طريقة أقصر بكثير يستخدمها المبرمجون في كل مكان: الدوال السهمية (Arrow Functions). وفي النصف الثاني من الدرس ستفهم النطاق (Scope)، أي القاعدة التي تحدد أين «يعيش» كل متغير وأين يمكنك استخدامه.
الدالة السهمية
Section titled “الدالة السهمية”قارن بين الطريقتين لكتابة نفس الدالة:
// الطريقة التقليديةfunction square(n) { return n * n;}
// الدالة السهميةconst square = (n) => n * n;الدالة السهمية تُحفظ في متغير (غالباً بـ const)، ثم تأتي المعاملات بين قوسين، ثم السهم =>، ثم النتيجة. اقرأها هكذا: «الدالة square تأخذ n وتعطي n × n».
const square = (n) => n * n;console.log(square(5));
const add = (a, b) => a + b;console.log(add(3, 4));257لاحظ أننا لم نكتب return ولا الأقواس المعقوفة. عندما يكون جسم الدالة تعبيراً واحداً، تُرجع الدالة السهمية قيمته تلقائياً. هذا يسمى «الإرجاع الضمني».
أشكال الدالة السهمية
Section titled “أشكال الدالة السهمية”// بدون معاملات: قوسان فارغانconst sayHi = () => console.log("مرحباً!");sayHi();
// معامل واحد: يمكن حذف القوسينconst doubleIt = n => n * 2;console.log(doubleIt(21));
// عدة أسطر: أقواس معقوفة و return صريحةconst describe = (name, age) => { const status = age >= 18 ? "بالغ" : "قاصر"; return `${name} ${status}`;};console.log(describe("علي", 20));مرحباً!42علي بالغستحب الدوال السهمية كثيراً في الدرس القادم، عندما نمررها لدوال المصفوفات مثل map و filter.
النطاق (Scope)
Section titled “النطاق (Scope)”النطاق هو المكان الذي يمكن فيه رؤية المتغير واستخدامه. تخيّل بيتاً فيه غرف. الأشياء الموجودة في الصالة يراها كل من في البيت. أما الأشياء الموجودة داخل غرفتك فلا يراها إلا من يدخل غرفتك.
النطاق العام والمحلي
Section titled “النطاق العام والمحلي”const siteName = "مدرسة البرمجة"; // عام: في الصالة
function showSite() { const page = "الرئيسية"; // محلي: داخل غرفة الدالة console.log(siteName, "-", page);}
showSite();console.log(page);مدرسة البرمجة - الرئيسيةReferenceError: page is not defined- المتغير
siteNameمعرّف خارج أي دالة، فهو عام (Global) ويمكن استخدامه في أي مكان، حتى داخل الدالة. - المتغير
pageمعرّف داخل الدالة، فهو محلي (Local) ويختفي بمجرد انتهاء الدالة. محاولة استخدامه من الخارج تسبب خطأ.
نطاق الكتلة
Section titled “نطاق الكتلة”المتغيرات التي تنشئها بـ let و const تعيش داخل أقرب قوسين معقوفين { } فقط، سواء كانت لدالة أو لـ if أو لحلقة:
if (true) { let secret = 42; console.log(secret);}console.log(secret);42ReferenceError: secret is not definedهذا سبب آخر لتفضيل let و const على var، فـ var لا تحترم حدود الكتلة.
نفس الاسم في نطاقين
Section titled “نفس الاسم في نطاقين”يمكن أن يوجد متغيران بنفس الاسم في نطاقين مختلفين، والأقرب هو الذي يُستخدم:
let color = "أزرق";
function paint() { let color = "أحمر"; console.log("داخل الدالة:", color);}
paint();console.log("خارج الدالة:", color);داخل الدالة: أحمرخارج الدالة: أزرقالمتغير الداخلي «يغطي» الخارجي داخل الدالة فقط، ولا يغيّره.
الدالة تستطيع تعديل متغير خارجي
Section titled “الدالة تستطيع تعديل متغير خارجي”الدالة ترى المتغيرات الموجودة في النطاق الأوسع، وتستطيع تعديلها أيضاً:
let score = 0;const addPoint = () => { score++;};
addPoint();addPoint();console.log(score);2جرّب بنفسك
Section titled “جرّب بنفسك”حوّل الدوال الثلاث إلى أشكال مختلفة، وجرّب أن تطبع bonus خارج الدالة لترى خطأ النطاق:
الناتج
أخطاء شائعة
Section titled “أخطاء شائعة”- نسيان return مع الأقواس المعقوفة:
const add = (a, b) => { a + b };تُرجعundefined. - استخدام متغير محلي خارج دالته: يسبب
ReferenceError. عرّف المتغير في النطاق الذي تحتاجه فيه. - استدعاء الدالة السهمية قبل تعريفها: الدالة المخزنة في
constلا يمكن استدعاؤها في سطر يسبق تعريفها.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ما ناتج const triple = (n) => n * 3; console.log(triple(4));؟
الدالة السهمية بتعبير واحد تُرجع قيمته تلقائياً: 4 × 3 = 12.
سؤال
متغير عرّفته بـ let داخل جملة if، أين يمكنك استخدامه؟
let و const لهما نطاق الكتلة، فالمتغير يعيش داخل القوسين المعقوفين اللذين عُرّف فيهما.
الخلاصة
Section titled “الخلاصة”- الدالة السهمية تُكتب
(معاملات) => نتيجة، وتُرجع التعبير الواحد تلقائياً. - مع الأقواس المعقوفة
{ }يجب كتابةreturnصراحة. - النطاق يحدد أين يُرى المتغير: عام في كل مكان، ومحلي داخل دالته فقط.
letوconstتعيشان داخل أقرب كتلة{ }.- اجعل كل متغير في أضيق نطاق يحتاجه.