in

أساسيات لغة جافا سكريبت Java Script: أهمية الدوال (Functions)

تعرفت في مقالات سابقة، ضمن سلسلة أساسيات لغة جافا سكريبت، إلى سياق التنفيذ في جافا سكريبت وكيفية عمل المُحرِّك . نكمل معك الآن فهم الأساسيات لنتحدّث بالتفصيل عن أهمية الدوال Functions في جافا سكريبت وكيفية التعامُل معها…

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

تحتاج إلى سحب المياه من هذه البئر عدة مرات في اليوم. من الصعب أن تقول “سأذهب لأخذ دلو فارغ، وأذهب إلى البئر، وأجلب المياه وأعود إلى المنزل”  في كل مرة تشرح فيها ما تفعله.

لاختصارها، يمكنك القول أنك بصدد (جلب المياه-drawWater)، وبهذا يا صديقي تكون قد أنشأت دالّة (Function).

تعريف الدوال  Declaring functions

الدالة؛ مجموعة من التعليمات البرمجية (codes) التي تقوم بتنفيذ مهام بترتيب معين، مثل تراتب الأحداث في المثال السابق، ويمكن تعريفها باستخدام الصيغة الآتية:

Funcion؛ هي الكلمة المفتاحية التي تخبر لغة جافا سكريبت أنك بصدد تعريف دالة.

functionName؛ تمثل اسم الدالة، وفي المثال السابق، يمكن كتابة (drawWater) في هذه الخانة.

لك الحرية في اختيار اسم الدالة طالما أنك تتبع القواعد الخاصة بالتصريح عن المتغيرات (Declaring Variables). بمعنى أنك بحاجة لاتباع القواعد الآتية:

  1. يجب أن يكون الاسم كلمة واحدة؛ أي لا يحتوي أية فراغات.
  2. يحتوي على حروف أو أرقام أو إشارة ضمن هذه المجموعة (A-Z, a-z, 0-9, _)، حيث يمكن أن يحتوي على جميع الرموز السابقة  في آن معًا، ولكن دون أن يحوي أي رموز اخرى.
  3. ألا يبدأ برقم.
  4. يجب ألا يحتوي على أي من هذه الكلمات  reserved keywords ؛ لأنها محجوزة لدوال جاهزة في لغة جافا سكريبت.

Parameters؛ هو بند اختياري؛ يمكن تركه فارغًا. إنه عبارة عن قائمة من المتغيرات التي ترغب في استخدامها في دالتك، ويمكنك تعيينها عند استخدام الدالة.


استخدام الدوال

بمجرد تعريف الدالة، يمكنك استخدامها (أو استدعاءَها، أو تنفيذها) عن طريق كتابة اسمها متبوعًا بقوس (). في ما يلي مثال يتم فيه تعريف  دالة اسمها sayHello، ووظيفتها هي طباعة جملة (Hello, Aliens!) على الشاشة عن طريق المحرر البرمجي  (console).


المسافة البادئة (The indentation)

يجب وضع مسافة قبل أي تعليمات برمجية  تُكتب داخل أي أقواس معقوفة { }. هذه ممارسة مهمة تجعل التعليمات البرمجية التي تكتبها أسهل للقراءة والمراجعة.

 ففي المثال السابق تستطيع أن تعرف أن الكود

 console.log(‘Hello, Aliens!’)

هو جزء من الدالة sayHello.

تعتبر المسافة البادئة اختيارية في لغة جافا سكريبت هدفها تنسيقي بحت؛ إذ يُمكن تحقيق المسافة البادئة بطريقتين:

  • إما عن طريق وضع فراغين أو ثلاثة (spaces) بشرط أن تكون متسقة ومتساوية كل مرة.
  • او عن طريق مفتاح tab على لوحة المفاتيح.

ملاحظة: تعتبر المسافة البادئة جزءًا لا يتجزأ من القواعد البرمجية لبعض اللغات الأخرى، مثل بايثون Python؛ إذ إن عدم وضعها قبل أي كود برمجي داخل أي دالة يعتبر خطأ برمجيًا مرمزًا بخطأ (IdentaionError).

. . .

المُعاملات (Parameters)

تستخدم معظم الدوال عدة معاملات لتنفذ مهامها، وهي عبارة عن قائمة من المتغيرات التي يجب أن تقوم بتعريفها قبل استخدامها في أي دالة ويمكن استخدام أي عدد من المتغيرات.

لتعيين قيم لهذه المعاملات  يجب أن تُمرِّر قيم تدعى (arguments)، من خلال كتابتها في شكل قيم مفصولة بفواصل بين الأقواس () .

سيتم تمرير القيمة الأولى للمُعامل الاول والقيمة الثانية للمُعامل الثاني وهكذا دواليك.

functionName(‘arg1’, ‘arg2’)

فلنوضح ذلك بمثال: بفرض أنك تريد كتابة دالة اسمها (sayName)؛ تسجّل الاسم الأول واسم العائلة للشخص. تبدو وظيفة هذه الدالة كالآتي:

لنفترض مثلاً أن اسمي الشخصي هو Kamal، واسم عائلتي هو Kamali. لجعل الدالة تعمل بشكل صحيح، نقوم بتمرير Kamal بمثابة قيمة argument  أولى، وKamali قيمة ثانية:

إذا عرَّفتَ أحد المُعاملات ولكنك لم تُمرر له أي قيمة، سيصبح المُعامل الذي قمت بتعريفه غير محدد القيمة (undefined).

. . .

عبارة الإعادة (return statement)

يمكن أن تحتوي الدوال على عبارة الإعادة التي تتكون من الكلمة المفتاحية (return) وقيمة معينة، مثلاً رقم معين (أو اقتران أو حتى دالة اخرى).

عند تنفيذ (execute) الدالة باستخدام إحدى المُحررات البرمجية، سيتم ذلك بالترتيب، وعند الوصول إلى عبارة (return)، سيتم تنفيذ القيمة المراد إعادتها كناتج نهائي للدالة، وأي سطر برمجي أسفل هذه العبارة لن يتم تنفيذه. من ثَم يُستكمَل التنفيذ بقيمة الأسطر البرمجية أسفل السطر الذي استدعى هذه الدالة.

إذا كانت القيمة المراد إعادتها هي اقتران أو عبارة (expression) فإن المحرر البرمجي في لغة جافا سكريبت سيحسب القيمة الناتجة عن هذا الاقتران أو العبارة أولاً قبل إرجاع هذه القيمة.

ملاحظة: تستطيع لغة جافا سكريبت تمرير و إعادة (permitives) فقط، وهي (السلاسل المحرفية -strings، والأرقام، والاقترانات التي تكون قيمها النهائية 0/1 أو صح/ خطأ -Boolean functions) بالاضافة الى الكائنات object مثل الدوال functions و المصفوفات arrays. أي شيء آخر يحتاج لتنفيذه واحتساب قيمته قبل اعادته.

. . .

سير عمل الدالة Flow of a function:

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

إليك الكود البرمجي الذي سنوضح:

أولاً وقبل كل شيء؛ تحتاج إلى تعريف الدالة قبل استخدامها. في السطر الأول، يرى المحرر البرمجي الخاص بلغة جافا سكريبت الكلمة المفتاحية  للدالة (function) ويعرف أن الدالة تسمى (add2) حسب مثالنا. يتخطّى المحررُ الكودَ البرمجي الموجود في الدالة في هذه المرحلة؛ لأن الدالة لم تُستخدَم حتى الآن.

بعد ذلك، يرى المحرر أنك قمت بتعريف متغير يسمى (number)، وتعيين نتيجة العبارة التالية إليه:

add2(8)

نظرًا لأن الطرف الأيمن (RHS) من الإسناد هو استدعاء لدالة تدعى (add2)، يحتاج المحرر إلى احتساب قيمة الدالة:

add2 (8)

 قبل أن تعيين النتيجة للمتغير(number). في هذا المثال، يتم إسناد القيمة 8 إلى المُعامل num، حيث إنه تم تمرير القيمة 8 كـ (argument)عند استدعاء الدالة :

add2 (8)

في الدالة add2، يرى المحرر البرمجي أن عبارة return تشير إلى (num + 2). تُعدّ هذه العبارة اقتران expression، لذلك يجب احتساب قيمتها أولاً. ونظرًا لأن num تساوي 8، يجب أن يكون عدد (num + 2) يساوي 10.

بمجرد احتساب قيمة العبارة (num + 2)، يردّ المحرر القيمة إلى استدعاء الدالة. يستبدلُ باستدعاء الدالة القيمةَ الناتجة. لذلك، تصبح

add2 (8) // = 10

وأخيرًا، بمجرد احتساب قيمة الطرف الأيمن من الإسناد في السطر الخامس، يُنشئ المُحرر المُتغير (number) ويُسنِد القيمة 10 إليه.

هذه هي الطريقة التي تقرأ بها سير عمل الدالة.

ملاحظة: تعني عبارة (const) أن المتغير (number) ستُسنَد إليه قيمة ثابتة (constant) وهي القيمة 10 كما في المثال السابق.

. . .

خاصية الرفع (Hoisting)

عندما يتم تعريف الدوال (كما تعلمت آنفًا)، تُرفَع أولويتها إلى أعلى النطاق أو الصفحة التي تكتب بها الكود الخاص بك وتُنفَّذ قبل أي أسطر برمجية أخرى؛ هذا يعني أن المجموعتين الآتيتين من التعليمات البرمجية متطابقة تمامًا.

تصبح خاصية الرفع مربكة أحيانًا؛ لأن المحرر البرمجي هُنا سوف يغير ترتيب الكود الخاص بك. وبسبب هذا، انصحك بشدة أن تُعرف الدوال قبل استخدامِها واستدعائِها. لا تعتمد  على خاصية الرفع دائمًا.

. . .

تعريف الدوال باستخدام تعابير الدالة (Function expressions):

توجد طريقة أخرى لتعريف الدوال وهي باستخدام (Function expressions)؛ حيث تقوم بتعريف متغير، ثم تُسند إليه دالة بدون اسم (دالة مجهولة).

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

حقيقةً؛ هذا سؤال مهم جدًا؛ لماذا  قد ترغب أصلاً في استخدام تعبيرات الدالة إذا كان بإمكانك التعريف عن الدوال باستخدام بناء جملة تعريف الدالة؟

 إنها طريقة مهمة… وسيتضح لك السبب عندما تتعلم كيفية تعريف الكائنات (objects) و(arrow functions).
لا تقلق؛ فسنُغطي هذه المواضيع بالتفصيل في المقالات القادمة.

. . .

الخلاصة:

  • الدالة؛ هي مجموعة من التعليمات البرمجية التي تنفذ المهام بترتيب معين، مثل: أخذ دلو فارغ، والذهاب إلى البئر، جلب المياه، والعودة إلى المنزل.
  • يمكن استدعاء الدالة عن طريق إضافة () إلى نهاية اسم الدالة. عند القيام بذلك، يمكنك إضافة قيم إضافية كـ arguments لاستخدامها في الدالة.
  • يمكن أن تحتوي كل دالة على عبارة (return) تقوم “بردّ” قيمة معينة عند استدعاء الدالة.
  • قدر ما تستطيع؛ لا تعتمد على خاصية الرفع عند كتابة الدوال. قم بتعريفهم قبل استخدامهم  واستدعائهم، دائمًا.

. . .

المصدر: freecodecamp

  • ترجمة: ياسر طبيلة.
  • مراجعة: ياسين بجدو.
  • تدقيق لغوي: نور عبدو.

بواسطة ياسر طبيله

خريج هندسة كهربائية، مهتم بالتكنولوجيا والبرمجة والتطبيقات المتعلقة بإنترنت الأشياء (IoT).

3 تعليق

ضع تعليقك

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

كم ثقبا يوجد في قشة الشرب؟

تجربة على المادة المظلمة لم تجد أي دليل على وجود الأكسيونات