دوال لغة الجافاسكربت (JavaScript Functions)
هذه مقالة غير مراجعة.(سبتمبر 2024) |
في JavaScript، تُعَرَّف الدالة (Function) على أنها كتلة من الأوامر البرمجية المنظمة قابلة لإعادة الاستخدام تؤدي مهمة معينة. يمكنك تعريفها مرة واحدة، ثم يمكنك تنفيذها (أو "استدعاؤها") كلما احتجت إلى تنفيذ تلك المهمة في برنامجك.[1]
تعريف الدالة (Function Definition)
[عدل]تعريف الدالة (ويُعرف أيضًا بتصريح الدالة أو عبارة الدالة) يتكون من الكلمة الرئيسية (Function)، متبوعةً بما يلي:
- اسم الدالة.
- قائمة المعاملات (parameters) الخاصة بالدالة، محصورة بين قوسين دائريين ومفصولة بفواصل.
- العبارات البرمجية في JavaScript التي تُعرِّف الدالة، محصورة بين أقواس معقوفة
{ /* … */ }
.
على سبيل المثال، الأوامر البرمجية التالية تعرّف دالة بسيطة باسم square:
function square(number) {
return number * number;
}
هذه الدالة تأخذ معامل واحد، وهو number، وتعيد مربع هذا الرقم.
يمكن أيضًا إنشاء الدوال باستخدام تعبير الدالة (Function Expression).
يمكن أن تكون هذه الدالة مجهولة؛ أي أنها لا تحتاج إلى اسم. على سبيل المثال، كان من الممكن تعريف الدالة square على النحو التالي:
const square = function (number) {
return number * number;
};
استدعاء الدوال (Calling Functions)
[عدل]تعريف الدالة لا يؤدي إلى تنفيذها. تعريفها يعني إعطاءها اسمًا وتحديد ما يجب القيام به عند استدعاء الدالة.
إن استدعاء الدالة يؤدي في الواقع إلى تنفيذ الإجراءات المحددة بقائمة المعاملات المشار إليها. على سبيل المثال، إذا قمت بتعريف الدالة square، فيمكنك استدعاؤها على النحو التالي:
square(5);
تنفذ الدالةوتعيدالنتيجة25.
رفع الدوال (Function Hoisting)
[عدل]و هي الآلية التي يتبعها محرك جافا سكريبت لرفع المتغيرات والدوال إلى أعلى نطاق التنفيذ الخاص بها (Execution context) في الذاكرة، على سبيل المثال:
console.log(square(5)); // 25
function square(n) {
return n * n;
}
تعمل هذه الكتلة من الأوامر البرمجية دون أي خطأ، رغم أن الدالة ()square يتم استدعاؤها قبل أن يتم التصريح عنها. يرجع السبب في ذلك إلى أن مترجم JavaScript يقوم برفع (Hoisting) التصريح الكامل للدالة إلى أعلى النطاق الحالي، لذا فإن الأوامر البرمجية أعلاه يعادل التالي:
// جميع التصريحات الدوال تُرفع فعليًا إلى أعلى النطاق
function square(n) {
return n * n;
}
console.log(square(5)); // 25
رفع الدوال يعمل فقط مع تصريحات الدوال (Function Declarations) وليس مع تعبيرات الدوال (Function Expressions). الأوامر البرمجية التالي لن يعمل:
console.log(square(5)); // خطأ: square is not defined
const square = function (n) {
return n * n;
};
في هذا المثال، سيتم التعامل مع square كمتغير، والذي لم يتم تعريفه بعد عند محاولة استدعاء الدالة، مما يؤدي إلى خطأ.
الاستدعاء الذاتي للدالة (Recursion)
[عدل]هو أسلوب برمجي حيث تقوم الدالة باستدعاء نفسها بشكل متكرر لحل مشكلة. على سبيل المثال،
// Program to countdown till 1
// recursive function
function counter(count) {
// display count
console.log(count);
// condition for stopping
if(count > 1) {
// decrease count
count = count - 1;
// call counter with new value of count
counter(count);
} else {
// terminate execution
return;
};
};
// access function
counter(5);
دالة ()counter هي دالة تكرارية، دالة تستدعي نفسها بشكل متكرر. يُطلق على شرط count > 1 حالة أساسية، وهو شرط يحدد متى يجب أن يتوقف التكرار.
الإغلاق (Closures)
[عدل]تُعَد الإغلاقات واحدة من أقوى ميزات JavaScript. تتيح تداخل الدوال وتمنح الدالة الداخلية وصولاً كاملاً إلى جميع المتغيرات والدوال المعرفة داخل الدالة الخارجية (وأيضًا إلى جميع المتغيرات والدوال التي تمتلكها الدالة الخارجية).
ومع ذلك، لا تمتلك الدالة الخارجية وصولاً إلى المتغيرات والدوال المعرفة داخل الدالة الداخلية. وهذا يوفر نوعًا من الت encapsulation (تغليف) لمتغيرات الدالة الداخلية.
أيضًا، نظرًا لأن الدالة الداخلية تمتلك وصولاً إلى نطاق الدالة الخارجية، فإن المتغيرات والدوال المعرفة في الدالة الخارجية ستظل موجودة لفترة أطول من مدة تنفيذ الدالة الخارجية، إذا تمكنت الدالة الداخلية من البقاء بعد انتهاء حياة الدالة الخارجية. يتم إنشاء الإغلاق عندما تُتاح الدالة الداخلية بطريقة ما لأي نطاق خارج الدالة الخارجية على سبيل المثال:
// الدالة الخارجية تعرف متغيرًا يسمى "name"
const pet = function (name) {
const getName = function () {
// الدالة الداخلية لديها وصول إلى متغير "name" في الدالة الخارجية
return name;
};
return getName; // إعادة الدالة الداخلية، مما يجعلها متاحة لنطاقات خارجية
};
const myPet = pet("Vivie");
console.log(myPet()); // "Vivie"
الدوال السهمية (Arrow Functions)
[عدل]تُعَد تعبيرات الدوال السهمية (Arrow Functions) واحدة من ميزات JavaScript التي تقدم صياغة أقصر مقارنةً بتعبيرات الدوال التقليدية ولا تمتلك خصائص مثل this، arguments، super وnew.target. الدوال السهمية دائمًا غير مسماة.
بدلاً من استخدام الصياغة التقليدية لتعبير الدالة، يمكنك استخدام الصياغة التالية:
const add = (a, b) => a + b;
في هذه الصياغة، لا تحتاج إلى استخدام الكلمة الرئيسية function، ولا تحتاج إلى استخدام الأقواس {} أو الكلمة الرئيسية return إذا كانت الدالة تحتوي على تعبير واحد.
مراجع
[عدل]- ^ "Functions - JavaScript | MDN". developer.mozilla.org (بالإنجليزية الأمريكية). 25 Jul 2024. Archived from the original on 2024-09-01. Retrieved 2024-09-01.