متى يجب استخدام تصريح الوظيفة مقابل تعبير الوظيفة

سلسلة المصطلحات الفنية

من المحتمل أنك تعرف بالفعل كيفية كتابة الوظائف بهاتين الطريقتين. function doStuff() {}و () =>{} أحرف نكتبها طوال اليوم. ولكن كيف يختلفان ولماذا استخدام أحدهما على الآخر؟

ملاحظة: الأمثلة معطاة في JavaScript. Y لدينا M ileage M ay V ary مع لغات أخرى.

الاختلاف الأول: الاسم

عند إنشاء دالة باسم ، يكون هذا إعلانًا عن وظيفة . قد يتم حذف الاسم في تعبيرات الوظائف ، مما يجعل هذه الوظيفة "مجهولة".

إعلان الوظيفة:

function doStuff() {};

تعبير الوظيفة:

const doStuff = function() {}

غالبًا ما نرى وظائف مجهولة المصدر مستخدمة مع بناء جملة ES6 مثل:

const doStuff = () => {}

الرفع

يشير الرفع إلى توفر الوظائف والمتغيرات "في الجزء العلوي" من التعليمات البرمجية ، على عكس ما يحدث فقط بعد إنشائها. يتم تهيئة الكائنات في وقت الترجمة وتكون متاحة في أي مكان في ملفك.

يتم رفع إعلانات الوظائف ولكن تعبيرات الوظائف ليست كذلك.

من السهل فهمه بمثال:

doStuff();
function doStuff() {};

ما ورد أعلاه لا يخطئ ، ولكن هذا من شأنه:

doStuff();
const doStuff = () => {};

حالة تعبيرات الوظيفة

قد يبدو الأمر كما لو أن إعلانات الوظائف ، بخصائصها القوية في الرفع ، سوف تتفوق على تعبيرات الوظائف من أجل الفائدة. لكن اختيار أحدهما على الآخر يتطلب التفكير في متى وأين تحتاج الوظيفة . في الأساس ، من يحتاج إلى معرفة ذلك؟

يتم استدعاء تعبيرات الوظائف لتجنب تلويث النطاق العالمي . بدلاً من أن يكون برنامجك على دراية بالعديد من الوظائف المختلفة ، عندما تحتفظ بها مجهولة الهوية ، يتم استخدامها ونسيانها على الفور.

IIFE

الاسم - الذي تم استدعاؤه على الفور لتعبيرات الوظائف - يقول كل شيء هنا. عندما يتم إنشاء دالة في نفس وقت استدعائها ، يمكنك استخدام IIFE ، والذي يبدو كالتالي:

(function() => {})()

أو:

(() => {})()

لإلقاء نظرة متعمقة على IIFEs ، راجع هذه المقالة الشاملة.

عمليات الاسترجاعات

غالبًا ما يُشار إلى الوظيفة التي يتم تمريرها إلى وظيفة أخرى باسم "رد الاتصال" في JavaScript. هذا مثال:

function mapAction(item) { // do stuff to an item } array.map(mapAction)
array.map(mapAction)

تكمن المشكلة هنا في أنه mapActionسيكون متاحًا للتطبيق بأكمله - ليست هناك حاجة لذلك. إذا كان رد النداء هذا عبارة عن تعبير وظيفي ، فلن يكون متاحًا خارج الوظيفة التي تستخدمه:

array.map(item => { //do stuff to an item })

أو

const mapAction = function(item) { // do stuff to an item } array.map(mapAction)
array.map(mapAction)

على الرغم من أنه mapActionسيكون متاحًا للترميز أدناه عند التهيئة.

ملخص

باختصار ، استخدم إعلانات الوظائف عندما تريد إنشاء دالة على النطاق العام وإتاحتها في جميع أنحاء التعليمات البرمجية الخاصة بك. استخدم تعبيرات الوظائف للحد من توفر الوظيفة ، والحفاظ على ضوء النطاق العام الخاص بك ، والحفاظ على بناء الجملة النظيف.

المراجع

  • إعلان الوظيفة ، مستندات MDN.
  • التعبير الوظيفي ، مستندات MDN.
  • الرفع ، مسرد MDN.

سلسلة المصطلحات التقنية

هناك الكثير من العبارات التي يتم طرحها في اللقاءات والمؤتمرات التقنية ، على افتراض أن كل شخص يعاني بالفعل من مشكلة في اللغة. غالبًا ما لا أتعامل مع اللغة. من الشائع أن يتصرف المطورون مندهشين لأنني أفتقر إلى جزء من المعرفة.

الحقيقة هي أنني في كثير من الأحيان لا أعرف الكلمة المناسبة لذلك. كبشر ، ولكن على وجه الخصوص البشر المطورين ، نحب استبعاد أولئك الذين لا "يتحدثون" ، لذا فإن هذه السلسلة تدور حول الحصول على فهم قوي لمفاهيم البرمجة التي "يجب أن يعرفها المرء".

هذه هي المقالة الثانية في السلسلة. الأول كان وظائف ذات رتبة أعلى. ابحث عن المزيد بينما أذهب إلى الاجتماعات والمؤتمرات وأتظاهر بمعرفة ما يتحدث زملائي التقنيين ، ولكن بعد ذلك يتعين علي العودة إلى المنزل واستخدام Google.