الدوال في JavaScript (Functions)
كلما كبر برنامجك، ستجد نفسك تكرر نفس الكود في أماكن كثيرة. الدوال (Functions) هي الحل: تكتب الكود مرة واحدة، وتعطيه اسماً، ثم تستخدمه متى شئت. في هذا الدرس ستتعلم كيف تنشئ دالة، وتعطيها بيانات، وتأخذ منها نتيجة.
ما هي الدالة؟
Section titled “ما هي الدالة؟”الدالة مثل وصفة طبخ مكتوبة في كتاب. تكتب الوصفة مرة واحدة، وكلما أردت أن تطبخ الطبق، تفتح الكتاب وتتبع الخطوات. لا تعيد كتابة الوصفة كل مرة!
function greet() { console.log("أهلاً بك في مدرسة البرمجة!");}
greet();greet();أهلاً بك في مدرسة البرمجة!أهلاً بك في مدرسة البرمجة!هنا خطوتان منفصلتان:
- تعريف الدالة: الكلمة
function، ثم اسم الدالةgreet، ثم قوسان، ثم الكود بين القوسين المعقوفين. التعريف وحده لا يُنفّذ أي شيء، إنه مجرد كتابة الوصفة. - استدعاء الدالة: كتابة اسمها متبوعاً بقوسين
greet(). هنا فقط يُنفّذ الكود. استدعيناها مرتين فظهرت الرسالة مرتين.
المعاملات: أعطِ الدالة بيانات
Section titled “المعاملات: أعطِ الدالة بيانات”الدالة السابقة تقول نفس الشيء دائماً. لنجعلها ترحب بأي شخص. نضع بين القوسين معاملاً (Parameter)، وهو متغير يستقبل القيمة عند الاستدعاء:
function greetUser(name) { console.log(`أهلاً يا ${name}`);}
greetUser("مريم");greetUser("يوسف");أهلاً يا مريمأهلاً يا يوسفالمعامل name مثل خانة فارغة في استمارة. وعند الاستدعاء تملأ الخانة بقيمة حقيقية مثل "مريم". القيمة التي تمررها تسمى وسيطاً (Argument).
return: أرجع نتيجة
Section titled “return: أرجع نتيجة”حتى الآن كانت دوالنا تطبع فقط. لكن غالباً تريد أن تحسب الدالة شيئاً وتعطيك النتيجة لتستخدمها لاحقاً. هنا تأتي return:
function add(a, b) { return a + b;}
let result = add(4, 6);console.log(result);console.log(add(10, 20) * 2);1060الدالة هنا مثل آلة العصير: تضع فيها فاكهة (المعاملات)، فتُخرج لك كوب عصير (القيمة المرجعة). ويمكنك أن تضع الكوب في أي مكان: في متغير، أو داخل عملية حسابية، أو داخل console.log.
return تُنهي الدالة
Section titled “return تُنهي الدالة”عندما تصل JavaScript إلى return، تخرج من الدالة فوراً، ولا تنفّذ أي سطر بعدها:
function checkAge(age) { if (age < 13) { return "عذراً، الموقع لمن هم 13 سنة فأكبر"; } return "مرحباً بك!";}
console.log(checkAge(10));console.log(checkAge(16));عذراً، الموقع لمن هم 13 سنة فأكبرمرحباً بك!الدالة بدون return
Section titled “الدالة بدون return”إذا نسيت return، فالدالة تُرجع undefined حتى لو حسبت شيئاً:
function double(n) { n * 2;}console.log(double(4));undefinedالقيم الافتراضية للمعاملات
Section titled “القيم الافتراضية للمعاملات”ماذا لو استدعيت الدالة بدون أن تعطيها كل القيم؟ المعامل الناقص يصبح undefined. لتجنب ذلك، أعطِ المعامل قيمة افتراضية بعلامة =:
function power(base, exp = 2) { return base ** exp;}
console.log(power(5));console.log(power(2, 3));258في الاستدعاء الأول لم نعطِ exp قيمة، فاستُخدمت القيمة الافتراضية 2.
لماذا الدوال مهمة؟
Section titled “لماذا الدوال مهمة؟”- عدم التكرار: تكتب الكود مرة واحدة وتستخدمه مئة مرة.
- سهولة التعديل: إذا أردت تغيير طريقة الحساب، تعدّل في مكان واحد فقط.
- تنظيم البرنامج: تقسّم المشكلة الكبيرة إلى مهام صغيرة، لكل منها دالة باسم واضح.
جرّب بنفسك
Section titled “جرّب بنفسك”هذه دالة تحسب ثمن طلب في متجر: السعر × الكمية + رسوم التوصيل (افتراضياً 20). جرّب استدعاءات جديدة، وأضف معاملاً للخصم:
الناتج
أخطاء شائعة
Section titled “أخطاء شائعة”- نسيان القوسين عند الاستدعاء: كتابة
greetوحدها لا تنفّذ الدالة. الاستدعاء يحتاجgreet(). - الطباعة بدلاً من الإرجاع: إذا كتبت
console.logداخل الدالة بدلاً منreturn، فلن تستطيع استخدام النتيجة في حسابات أخرى. - كتابة كود بعد return: أي سطر بعد
returnفي نفس المسار لن يُنفّذ أبداً.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ما الذي يُنفّذ الكود الموجود داخل الدالة؟
التعريف يكتب «الوصفة» فقط، والاستدعاء مثل greet() هو الذي ينفّذها.
سؤال
ماذا تُرجع دالة ليس فيها return؟
أي دالة لا تصل إلى return تُرجع undefined تلقائياً.
الخلاصة
Section titled “الخلاصة”- الدالة كود له اسم، تعرّفه مرة بـ
functionوتستدعيه بـname()متى شئت. - المعاملات خانات تستقبل القيم عند الاستدعاء.
returnتُرجع نتيجة من الدالة وتُنهي تنفيذها فوراً.- الدالة بدون
returnتُرجعundefined. - القيم الافتراضية مثل
exp = 2تُستخدم عندما لا يُمرَّر الوسيط.