Javaنص تعريفي واستدعاء وظائف مع مثال

⚡ ملخص ذكي

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

  • 🔘 بناء الجملة: تُعرّف الكلمة المفتاحية للدالة، والاسم، والأقواس، والأقواس المعقوفة كل دالة كلاسيكية.
  • ☑️ الدعوة: Code يتم تنفيذ الكود داخل الدالة فقط عند استدعاء اسم الدالة باستخدام الأقواس.
  • ✅ الحجج: القيم الموضوعة داخل الأقواس تمرر البيانات من المستدعي إلى جسم الدالة.
  • 🧪 الإرجاع: تقوم الكلمة المفتاحية return بإعادة قيمة إلى المستدعي وتوقف التنفيذ عند تلك النقطة.
  • 🛠️ المتغيرات: تُناسب كل من التصريحات والتعبيرات ووظائف الأسهم وIIFE ووظائف الاستدعاء موقفًا مختلفًا.
  • 📊 مجال العمل يتم رفع تعريفات الدوال، بينما لا يتم رفع تعبيرات الدوال ودوال الأسهم.

Javaتعريف واستدعاء الدوال في البرنامج النصي

ما هي الوظيفة في Javaالبرنامج النصي؟

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

لا يتم تنفيذ أي شيء داخل الأقواس بشكل مستقل. يقوم المتصفح بتخزين الكتلة البرمجية بالاسم الذي حددته لها، ولا يتم تنفيذ الكود إلا عند كتابة هذا الاسم متبوعًا بأقواس، مثل: myFunction()لذا، فإن الوظائف تقع في صميم كل Javaسيناريو البرنامج، سواء كان النص موجودًا أم لا داخل الصفحة أو في ملف خارجي.

كيفية إنشاء وظيفة في Javaسيناريو

  1. استخدم الكلمة الأساسية وظيفة متبوعًا باسم الوظيفة.
  2. بعد اسم الوظيفة ، افتح الأقواس وأغلقها.
  3. بعد الأقواس ، افتح وأغلق الأقواس المتعرجة.
  4. داخل الأقواس المتعرجة ، اكتب سطور التعليمات البرمجية الخاصة بك.

بناء الجملة:

function functionname()
{

  lines of code to be executed

}

يوضح المثال أدناه myFunction() ثم يستدعيها في السطر التالي مباشرةً، بحيث تظهر الرسالة فور تحميل الصفحة. جرب ذلك بنفسك:

<html>
<head>
	<title>Functions!!!</title>
	<script type="text/javascript">
      function myFunction()
      {
      	document.write("This is a simple function.<br />");
      }
		myFunction();
	</script>
</head>
<body>
</body>
</html>

وظيفة مع الحجج

يمكنك إنشاء دوال مع وسائط أيضًا. يجب تحديد الوسائط بين قوسين.

بناء الجملة:

function functionname(arg1, arg2)

{

  lines of code to be executed

}

هنا countVowels() يستقبل البرنامج أي اسم يُدخله الزائر في خانة البحث، ثم يمر على كل حرف، ويُبلغ عن عدد حروف العلة التي يحتويها الاسم. جرب ذلك بنفسك:

<html>
<head>
	<script type="text/javascript">
		var count = 0;
		function countVowels(name)
		{
			for (var i=0;i<name.length;i++)
			{
              if(name[i] == "a" || name[i] == "e" || name[i] == "i" || name[i] == "o" || name[i] == "u")
              count = count + 1;
			}
		document.write("Hello " + name + "!!! Your name has " + count + " vowels.");
		}
   	 	var myName = prompt("Please enter your name");
    	countVowels(myName);
	</script>
</head>
<body>
</body>
</html>

Javaقيمة إرجاع البرنامج النصي

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

بناء الجملة:

function functionname(arg1, arg2)

{

  lines of code to be executed

  return val1;

}

في هذا المثال الأخير returnSum() يُعيد هذا الأمر المجموع إلى السطر الذي استدعاه، بحيث يمكن دمج النتيجة في جملة بدلاً من طباعتها داخل الدالة. جرّب ذلك بنفسك:

<html>
<head>
	<script type="text/javascript">
		function returnSum(first, second)
        {
          var sum = first + second;
          return sum;
        }
      var firstNo = 78;
      var secondNo = 22;
      document.write(firstNo + " + " + secondNo + " = " + returnSum(firstNo,secondNo));
	</script>
</head>
<body>
</body>
</html>

أنواع الدوال في Javaسيناريو

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

نوع الوظيفة بناء الجملة النموذجي عند استخدامه
إعلان الوظيفة دالة greet() { } منطق مُسمى وقابل لإعادة الاستخدام؛ يُرفع إلى أعلى نطاقه
تعبير الدالة const greet = function () { }; تخزين دالة في متغير؛ غير مرفوعة
دالة السهم (ES6) const greet = () => { }; استدعاءات قصيرة؛ ترث هذا من النطاق المحيط
وظيفة مجهولة setTimeout(function () { }, 100); منطق لمرة واحدة يتم تمريره مباشرة إلى دالة أخرى
إيف (وظيفة () { })()؛ يتم تشغيله فورًا ويحافظ على خصوصية متغيراته
أن نتواصل معك items.forEach(showItem); دالة يتم تمريرها إلى دالة أخرى ويتم استدعاؤها لاحقًا

ملاحظة على الأمثلة أعلاه: استخدام العينات التاريخية var و document.write()ولا يزال كلاهما يعمل في جميع المتصفحات. وتُعرّف الممارسة الحالية المتغيرات باستخدام let or const ويطبع المخرجات من خلال console.log() أو عن طريق الضبط textContent على عنصر، لأن document.write() يمسح الصفحة التي تم تحميلها بالفعل. type="text/javascript" السمة اختيارية أيضًا في HTML5.

معلمات الدالة، والوسائط، والقيم الافتراضية

المعاملات هي أسماء العناصر النائبة المدرجة في التعريف، بينما الوسائط هي القيم الحقيقية التي يتم توفيرها عند استدعاء الدالة. countVowels(name) في الاعلى، name هو المعامل والنص المكتوب في موجه الأوامر هو الوسيط.

function greet(user, greeting = "Hello")
{
  return greeting + ", " + user;
}

greet("Ann");
greet("Ann", "Welcome");
  • يصبح المعامل الذي لا يحتوي على وسيط مطابق undefined ما لم يتم توفير قيمة افتراضية، كما greeting تجدها هنا.
  • يتم تجاهل الوسائط الإضافية بواسطة قائمة المعلمات، ولكن تظل قابلة للوصول من خلال arguments الكائن داخل أي دالة غير سهمية.
  • معامل الراحة مكتوب على النحو التالي ...values يجمع كل الحجج المتبقية في حجة حقيقية مجموعة.

نطاق الوظيفة والرفع في Javaسيناريو

يُحدد مكان كتابة الدالة ما يمكنها رؤيته ومتى يمكن استدعاؤها. هناك قاعدتان تفسران تقريبًا كل المفاجآت التي يواجهها المبتدئون.

  • الرفع: تُنقل تعريفات الدوال إلى أعلى نطاقها قبل تشغيل البرنامج النصي، لذا يمكن استدعاؤها في سطر أعلى تعريفها. أما تعابير الدوال ودوال الأسهم فلا تُنقل إلى أعلى نطاقها، وتُصدر خطأً إذا تم استدعاؤها مبكرًا.
  • مجال العمل المتغيرات المعلنة باستخدام var تكون العناصر الموجودة داخل الدالة مرئية في جميع أنحاء تلك الدالة، بينما let و const تقتصر على الكتلة التي توجد فيها. أي شيء يتم تعريفه خارج كل دالة يكون عامًا.

يُظهر عداد حروف العلة هذا عمليًا. count تم تعريف المتغير خارج الدالة، لذا فإن استدعاء countVowels() في المرة الثانية على نفس الصفحة، يستمر الحساب في الإضافة إلى المجموع السابق بدلاً من إعادة البدء من الصفر. نقل التصريح داخل الدالة سيؤدي إلى إعادة ضبطه في كل استدعاء.

هذه scoping تنطبق القواعد أيضًا على كود جانب الخادم، ولهذا السبب ينطبق نفس المنطق عند كتابة الدوال لـ Node.js ولماذا يظهر سلوك الوظيفة بشكل متكرر في Javaأسئلة المقابلة المكتوبة.

الأسئلة الشائعة

لا تزال الدالة تعمل، لكنها تعيد القيمة. undefined. إسناد هذا الاستدعاء إلى متغير يخزن undefinedولهذا السبب يستخدم مثال المجموع دالة الإرجاع بدلاً من طباعة المجموع داخل جسم الدالة.

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

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

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

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

تُعيد الدالة غير المتزامنة دائمًا وعدًا. داخلها، تُوقف الدالة `await` تنفيذ الدالة مؤقتًا حتى يتم التحقق من الوعد المنتظر، مما يسمح للبرنامج غير المتزامن بالقراءة من الأعلى إلى الأسفل. ويستمر باقي محتوى الصفحة في الاستجابة أثناء انتظار الدالة.

قم بربطه بمستمع حدث: حدد الزر، ثم استدعِ الدالة addEventListener مع اسم الحدث ومرجع الدالة. تعمل خاصية onclick المضمنة القديمة أيضًا، مع أن فصل الترميز عن السلوك هو الأفضل الآن.

تستدعي الأقواس الدالة مباشرةً وتُنتج نتيجتها. كتابة الاسم فقط تُمرر الدالة نفسها، وهو ما تحتاجه دوال الاستدعاء. إضافة أقواس عن طريق الخطأ داخل دالة setTimeout تُشغّل الكود مباشرةً بدلاً من تشغيله لاحقًا.

تلخيص هذه التدوينة بـ: