تعابير الدوال والدوال السهمية في جافاسكربت
تُعتبر الدوال في لغة جافاسكربت من الأساسيات التي تشكل جوهر البرمجة في هذه اللغة. فهي تُستخدم لتنظيم الكود وجعل الوظائف قابلة لإعادة الاستخدام وتسهيل عمليات المعالجة. في جافاسكربت، هناك طريقتان رئيسيتان لتعريف الدوال: الطريقة التقليدية عبر التعابير الوظائفية (Function Expressions) والطريقة الحديثة التي تعتمد على الدوال السهمية (Arrow Functions). تعبيرات الدوال والدوال السهمية هما مفهومان متداخلان في جافاسكربت، ولكنهما يتمتعان بخصائص وميزات تميزهما عن بعضهما البعض.
1. تعريف الدوال في جافاسكربت
في جافاسكربت، يمكن تعريف الدوال بعدة طرق، ويعود اختيار الطريقة إلى تفضيل المبرمج وسياق التطبيق الذي يتم العمل عليه. من بين أشهر الطرق لتعريف الدوال نجد:
-
تعريف الدوال التقليدية (Function Declarations):
هذه هي الطريقة الأكثر شيوعًا لتعريف الدوال، حيث يتم استخدام الكلمة المفتاحيةfunctionيليها اسم الدالة والمعاملات، ثم الجسم الذي يحتوي على الكود المراد تنفيذه. على سبيل المثال:javascriptfunction greet(name) { console.log("Hello, " + name); }هذه الطريقة تتميز بأنها تستطيع أن تُستخدم قبل تعريفها في الكود (بسبب ما يُسمى بـ “التفسير المتقدم” في جافاسكربت).
-
تعابير الدوال (Function Expressions):
تعبير الدالة هو تعبير يتم فيه تعريف دالة وتعيينها إلى متغير. لا يمكن استدعاء هذه الدالة قبل تعريفها في الكود. على سبيل المثال:javascriptconst greet = function(name) { console.log("Hello, " + name); };من هنا يظهر الفرق بين الطريقة التقليدية وتعابير الدوال؛ حيث لا يمكن استخدام تعبيرات الدوال قبل تعريفها.
-
الدوال السهمية (Arrow Functions):
قدمت جافاسكربت في النسخة ES6 (التي أُصدرت في 2015) أسلوبًا جديدًا لتعريف الدوال باستخدام الصيغة السهمية، والتي تتميز بصيغة مختصرة وبساطة أكبر مقارنة بالدوال التقليدية. تتسم الدوال السهمية بأنها لا تمتلك خصائص الكائنات الخاصة بالدوال التقليدية، مثل الكلمة المفتاحيةthis، مما يجعلها مناسبة للعديد من الاستخدامات في السياقات الحديثة.
2. تعابير الدوال (Function Expressions)
تعابير الدوال هي أسلوب في جافاسكربت يتم فيه تعريف الدالة في سياق تعبير يُعين إلى متغير. هذه الدوال لا يتم رفعها إلى أعلى الكود مثل دوال التصريح، مما يعني أنه لا يمكن استخدامها قبل تعريفها. عادةً ما يتم استخدامها في التطبيقات التي تحتاج إلى دوال مؤقتة أو دوال يتم تمريرها كمعاملات إلى دوال أخرى، مثلما يحدث في الدوال المستخدمة في العمليات غير المتزامنة أو عند التعامل مع التفاعل مع الأحداث في واجهات المستخدم.
الخصائص الرئيسية لتعبيرات الدوال:
-
لا يتم رفعها: كما ذكرنا، لا يتم رفع تعابير الدوال إلى أعلى الكود مثل دوال التصريح، لذا يجب تعريفها قبل استخدامها.
-
تعيين دالة إلى متغير: يتم استخدام متغير لحفظ الدالة، ويمكن بعد ذلك استدعاء الدالة باستخدام اسم المتغير.
-
الدوال كمعاملات: يمكن تمرير الدوال التي تُعرَف كتعابير دوال إلى دوال أخرى، مما يجعلها مفيدة جدًا في تطبيقات الواجهة الأمامية وعمليات المعالجة غير المتزامنة.
مثال على تعبير دالة:
javascriptconst add = function(a, b) {
return a + b;
};
console.log(add(5, 3)); // 8
3. الدوال السهمية (Arrow Functions)
تُعتبر الدوال السهمية أحد التحسينات الكبيرة التي جلبتها ES6 لجافاسكربت، حيث أنها تتيح تعريف الدوال بطريقة أكثر اختصارًا ووضوحًا. صيغة الدوال السهمية تقلل من استخدام الأقواس والكلمات المفتاحية المكررة، مما يجعل الكود أقصر وأكثر سهولة في القراءة.
الخصائص الرئيسية للدوال السهمية:
-
صِيغة مختصرة: لا تحتاج إلى الكلمة المفتاحية
functionولا إلى كلمةreturnفي حالة الدوال الأحادية الجملة. -
السياق الثابت لـ
this: في حين أن الدوال التقليدية تُنشئ سياقًا جديدًا للكلمة المفتاحيةthis، فإن الدوال السهمية لا تملك هذا السلوك، فهي تقوم ببساطة بالاحتفاظ بسياق الكائن الخارجي الذي تم تعريفها فيه. لذلك فإن هذا السلوك مفيد بشكل خاص في بعض السياقات مثل المعالجة غير المتزامنة أو الحلقات. -
دوال أحادية الجملة: في حالة كان الجسم عبارة عن جملة واحدة فقط، يمكن اختصار الدالة لتكون في سطر واحد، وفي هذه الحالة لا حاجة لاستخدام الكلمة
return:javascriptconst add = (a, b) => a + b; console.log(add(5, 3)); // 8
مثال آخر للدوال السهمية مع استخدام this:
javascriptconst obj = {
name: "JavaScript",
greet: function() {
setTimeout(() => {
console.log("Hello from " + this.name);
}, 1000);
}
};
obj.greet(); // "Hello from JavaScript"
هنا نلاحظ أن الدالة السهمية في setTimeout لا تنشئ سياقًا جديدًا لـ this، بل تستخدم قيمة this من الكائن obj، وهو سلوك مفيد للغاية عند التعامل مع الدوال غير المتزامنة.
4. الاختلافات بين تعابير الدوال والدوال السهمية
بينما توفر كل من تعابير الدوال والدوال السهمية طريقة مرنة وسهلة لتعريف الدوال، فإن هناك بعض الفروق الجوهرية بينهما:
-
السياق الخاص بـ
this:-
في الدوال التقليدية وتعابير الدوال، يتم إنشاء سياق جديد لـ
thisبناءً على طريقة الاستدعاء. -
أما في الدوال السهمية، فإن
thisلا يتغير. فهي تأخذ قيمةthisمن السياق الذي تم تعريفها فيه.
-
-
التعريف والاستخدام:
-
الدوال السهمية تُعتبر صيغة أكثر اختصارًا وسهولة لكتابة الدوال ذات جملة واحدة.
-
تعابير الدوال تسمح بمرونة أكبر في بعض الحالات التي قد تتطلب استخدام دالة بدون اسم.
-
-
التعامل مع الكائنات:
-
في الدوال السهمية، لا يتم استخدام الكلمة المفتاحية
newلإنشاء كائنات، في حين أن الدوال التقليدية يمكن استخدامها كـ “مُنشئ” لإنشاء كائنات جديدة.
-
-
التعريف المسبق:
-
الدوال التقليدية يمكن استدعاؤها قبل تعريفها بفضل “الرفع”.
-
تعابير الدوال يجب تعريفها أولًا قبل استدعائها.
-
5. متى نستخدم الدوال السهمية؟
تُستخدم الدوال السهمية بشكل رئيسي في الحالات التي:
-
نحتاج فيها إلى الحفاظ على سياق
thisداخل دالة غير متزامنة أو عند التعامل مع الأحداث في واجهات المستخدم. -
نرغب في كتابة دالة بشكل مختصر وواضح.
-
نحتاج إلى دوال صغيرة لا تنطوي على تعقيدات كثيرة.
6. متى نستخدم تعابير الدوال التقليدية؟
في بعض الحالات التي تتطلب استخدام دوال يمكن أن تكون بمثابة مُنشئ للكائنات أو في الحالات التي نحتاج فيها إلى الوصول إلى this بطريقة مرنة وديناميكية، قد تكون تعابير الدوال هي الخيار الأفضل. كما أن دوال التصريح تظل الخيار المفضل في بعض التطبيقات التي تتطلب رفع الدالة (Hoisting).
7. الختام
تعابير الدوال والدوال السهمية هما من بين الأدوات القوية التي قدمتها جافاسكربت للمطورين. كل منهما له مزايا في السياقات المختلفة. في حين أن الدوال السهمية تُمكّن المبرمجين من كتابة الكود بشكل أكثر إيجازًا مع الحفاظ على سياق ثابت لـ this، فإن تعابير الدوال توفر مرونة أكبر من حيث التعامل مع كائنات جديدة وسياقات متغيرة. فهم الفروق بين هاتين الطريقتين واختيار الأنسب لكل حالة يُعد جزءًا أساسيًا من تحسين جودة الكود في التطبيقات الحديثة.

