| النوع | الصيغة | Hoisting |
|---|---|---|
| Function Declaration | function اسم() {} | كامل |
| Function Expression | const اسم = function() {} | لا |
| Arrow Function | const اسم = () => {} | لا |
الدالة (Function) هي كتلة كود منظمة ومسمّاة تؤدي مهمة محددة، ويمكن استدعاؤها (تشغيلها) عدة مرات من أماكن مختلفة في البرنامج دون إعادة كتابة نفس الكود. هذا المبدأ يُعرف بـ DRY — اختصار "Do not Repeat Yourself" — وهو أحد أهم مبادئ البرمجة الجيدة.
توجد عدة طرق لتعريف دالة في جافاسكريبت. الأولى هي إعلان الدالة (Function Declaration) باستخدام الكلمة المفتاحية function متبوعة باسم الدالة — وهذا النوع يخضع لظاهرة الـ Hoisting الكاملة، أي يمكن استدعاؤه حتى قبل مكان تعريفه في الكود. الثانية هي تعبير الدالة (Function Expression)، حيث تُسند الدالة لمتغير، ولا تخضع لنفس Hoisting الكامل — يجب تعريفها قبل استدعائها.
لاستدعاء دالة (تشغيلها)، تكتب اسمها متبوعاً بقوسين ()، مع تمرير أي قيم مطلوبة (Arguments) داخل القوسين إذا كانت الدالة تتوقعها. الدالة يمكن أن "تُعيد" قيمة باستخدام return، وبمجرد تنفيذ return يتوقف تنفيذ الدالة فوراً ولا يُنفَّذ أي كود بعدها. إذا لم تحتوِ الدالة على return صريح، فهي تُعيد undefined تلقائياً.
الدوال تقبل معاملات (Parameters) عند تعريفها، وتُمرَّر لها قيم فعلية (Arguments) عند استدعائها. عدد المعاملات التي تتوقعها الدالة لا يجب أن يتطابق تماماً مع عدد القيم الممررة — إذا نقصت قيمة، يأخذ المعامل المقابل قيمة undefined تلقائياً.
| 1 | // إعلان دالة (Function Declaration) |
| 2 | function جمع(أ, ب) { |
| 3 | return أ + ب; |
| 4 | } |
| 5 | |
| 6 | // تعبير دالة (Function Expression) |
| 7 | const طرح = function (أ, ب) { |
| 8 | return أ - ب; |
| 9 | }; |
| 10 | |
| 11 | console.log(جمع(5, 3)); // 8 |
| 12 | console.log(طرح(5, 3)); // 2 |
مثال 1: دوال بدون معاملات ومع قيم افتراضية
| 1 | // دالة بدون معاملات |
| 2 | function رسالة_ترحيب() { |
| 3 | console.log("أهلاً بك!"); |
| 4 | } |
| 5 | رسالة_ترحيب(); |
| 6 | |
| 7 | // دالة بمعاملات وقيمة افتراضية |
| 8 | function تحية(اسم = "زائر") { |
| 9 | return `مرحباً يا ${اسم}!`; |
| 10 | } |
| 11 | console.log(تحية()); // "مرحباً يا زائر!" |
| 12 | console.log(تحية("سارة")); // "مرحباً يا سارة!" |
مثال 2: الفرق في Hoisting بين نوعي الدوال
| 1 | // Hoisting: يعمل الإعلان حتى قبل تعريفه |
| 2 | console.log(مربع(4)); // 16 — يعمل رغم أن الدالة عُرّفت لاحقاً |
| 3 | |
| 4 | function مربع(رقم) { |
| 5 | return رقم * رقم; |
| 6 | } |
| 7 | |
| 8 | // لكن تعبير الدالة لا يعمل قبل تعريفه |
| 9 | // console.log(تكعيب(2)); // ❌ خطأ |
| 10 | const تكعيب = function (رقم) { |
| 11 | return رقم ** 3; |
| 12 | }; |