الدالة كتلة من الكود المنظَّم القابل لإعادة الاستخدام، وتُستخدم لتنفيذ إجراء ما. هناك أساليب متعددة لتعريف الدوال في JavaScript. سنتناول هنا تصريحات الدوال و_تعبيرات الدوال_. وسنغطي احتمالات أخرى مثل الدوال السهمية في مفاهيم أخرى.
الأسلوب المعتاد لتعريف دالة في JavaScript هو تصريح الدالة، ويُسمى أيضًا تعريف الدالة أو عبارة الدالة.
ويتكوّن من الكلمة المفتاحية function، واسم الدالة، وقائمة معاملات مفصولة بفواصل داخل الأقواس الهلالية.
ويتبع ذلك جسم الدالة (مجموعة العبارات التي تحدّد ما تفعله الدالة) محصورًا بين الأقواس المعقوفة.
function someName(param1, param2, param3) {
// ...
}
في JavaScript، تُستدعى الدالة (يُنادى عليها) بكتابة اسم الدالة متبوعًا بأقواس هلالية تحتوي على الوسائط.
someName(arg1, arg2, arg3);
عند التعامل مع المعاملات داخل جسم الدالة، انتبه إلى الآثار الجانبية المحتملة.
افتراضيًا، جميع المعاملات المعرَّفة في تصريح الدالة اختيارية في JavaScript.
وإذا مرّرت وسائط أقل من عدد المعاملات، فستكون الوسائط الناقصة undefined داخل الدالة، راجع null وundefined.
وفي كثير من الحالات يكون من المنطقي إسناد قيمة افتراضية أنسب من undefined.
ويمكن فعل ذلك بتحديد معاملات افتراضية مباشرة في تعريف الدالة.
function someName(param1 = defaultValue1, param2 = defaultValue2) {
// ...
}
return
تُنهي عبارة return تنفيذ الدالة، وتحدّد قيمة تُرجع إلى من استدعى الدالة. ويمكن أن تحتوي الدالة على عدة عبارات return.
function checkNumber(num) {
if (num === 0) {
return 'You passed 0, please provide another number.';
}
return 'Thanks for passing such a nice number.';
}
يمكن تخزين القيمة المُرجَعة من الدالة في متغير.
function sum(x, y) {
return x + y;
}
const total = sum(5, 10);
// => 15
نتيجة دالة لا تُرجع أي قيمة، أو لا تحتوي على عبارة return، هي undefined.
ولا توجد عمليات إرجاع ضمنية في JavaScript.
function nakedReturn(a) {
a * 2;
return;
}
nakedReturn(1);
// => undefined
function noReturn(a) {
a * 2;
}
noReturn(1);
// => undefined
في JavaScript، يمكنك إرجاع قيمة واحدة فقط. وإذا أردت تمرير معلومات أكثر، عليك دمجها أولًا في كيان واحد، غالبًا في كائن أو مصفوفة.
function divide(a, b) {
return {
quotient: Math.floor(a / b),
remainder: a % b,
};
}
تصريح الدالة عبارة مستقلة. لكن من المفيد أحيانًا تعريف دالة كجزء من تعبير آخر، مثل داخل إسناد، أو كمعامل دالة (دالة الاستدعاء الرجعي)، أو كقيمة في كائن. ويمكن فعل ذلك بتعبير دالة. صياغته مطابقة لصياغة تصريح الدالة، إلا أنه يمكن حذف اسم الدالة لإنشاء دالة مجهولة.
const someFunction = function (param) {
// ...
};
someOtherFunction(function (param) {
// ...
});
const obj = {
someFunction: function (param) {
// ...
},
};
في هذا التمرين، ستكتب المزيد من الكود المتعلق بتحضير وطهي اللازانيا الرائعة من كتاب الطبخ المفضل لديك.
لديك خمس مهام. تتعلق المهمة الأولى بالطهي نفسه، بينما تتعلق المهام الأربع الأخرى بالتحضير المثالي.
عندما تكون اللازانيا في الفرن، تريد أن تعرف ما إذا كان بإمكانك إخراجها بالفعل أم لا. للتأكد من أن اللازانيا لا تحترق في الفرن، عادةً ما تضبط مؤقتًا. لكنك تنسى ذلك أحيانًا.
اكتب دالة cookingStatus تقبل الوقت المتبقي على المؤقت بالدقائق كمعامل.
وللدالة ثلاث نتائج محتملة.
0، فيجب أن تُرجع 'Lasagna is done.'.'Not done, please wait.'.'You forgot to set the timer.'.لن يظهر المؤقت أبدًا قيمة أقل من 0.
cookingStatus(12);
// => 'Not done, please wait.'
cookingStatus();
// => 'You forgot to set the timer.'
للازانيا التالية التي ستحضّرها، تريد أن تتأكد من أنك حجزت وقتًا كافيًا لتستمتع بالطهي. لقد وضعت بالفعل خطة بكل الطبقات التي ستتكون منها اللازانيا. الآن تريد تقدير المدة التي سيستغرقها التحضير بناءً على ذلك.
نفّذ دالة preparationTime تقبل مصفوفة طبقات ومتوسط وقت التحضير لكل طبقة بالدقائق.
يجب أن تُرجع الدالة تقدير الوقت الإجمالي للتحضير بناءً على عدد الطبقات.
إذا استُدعيت الدالة دون تمرير متوسط وقت التحضير، فيُفترض 2 دقيقة بدلًا من ذلك.
const layers = ['sauce', 'noodles', 'sauce', 'meat', 'mozzarella', 'noodles'];
preparationTime(layers, 3);
// => 18
preparationTime(layers);
// => 12
إلى جانب حجز الوقت، تريد أيضًا التأكد من أن لديك ما يكفي من الصلصة والمعكرونة لطهي لازانيا أحلامك. لكل طبقة معكرونة في اللازانيا، ستحتاج إلى 50 غرامًا من المعكرونة. لكل طبقة صلصة في اللازانيا، ستحتاج إلى 0.2 لتر من الصلصة.
عرّف الدالة quantities التي تأخذ مصفوفة طبقات كمعامل.
ستحدد الدالة بعد ذلك كمية المعكرونة والصلصة اللازمة لتحضير وجبتك.
يجب إرجاع النتيجة ككائن بمفتاحين هما noodles وsauce.
quantities(['sauce', 'noodles', 'sauce', 'meat', 'mozzarella', 'noodles']);
// => { noodles: 100, sauce: 0.4 }
منذ فترة زرت صديقًا وتناولت اللازانيا عنده. كانت رائعة وكان فيها شيء مميز. أرسل إليك صديقك قائمة المكونات وأخبرك أن العنصر الأخير في القائمة هو "المكوّن السري" الذي جعل الوجبة مميزة إلى هذا الحد. الآن تريد إضافة ذلك المكوّن السري إلى وصفتك أيضًا.
اكتب دالة addSecretIngredient تقبل مصفوفتين من المكونات كمعاملين.
المعامل الأول هو القائمة التي أرسلها إليك صديقك، والثاني هو قائمة مكونات وصفتك.
يجب أن تضيف الدالة العنصر الأخير من قائمة صديقك إلى نهاية قائمتك.
يجب تعديل المصفوفة التي تمثل وصفتك مباشرةً، ويجب ألا تُرجع الدالة أي شيء.
ومع ذلك، يجب ألا يُعدَّل الوسيط الأول.
const friendsList = ['noodles', 'sauce', 'mozzarella', 'kampot pepper'];
const myList = ['noodles', 'meat', 'sauce', 'mozzarella'];
addSecretIngredient(friendsList, myList);
// => undefined
console.log(myList);
// => ['noodles', 'meat', 'sauce', 'mozzarella', 'kampot pepper']
الكميات المذكورة في كتاب الطبخ لديك تكفي فقط لتحضير لازانيا لحصتين. بما أنك تريد الطبخ لعدد أكبر من الأشخاص في المرة القادمة، فأنت تريد حساب الكميات لعدد مختلف من الحصص.
نفّذ دالة scaleRecipe تأخذ معاملين.
يجب أن تُرجع الدالة كائن وصفة يحتوي على الكميات اللازمة لعدد الحصص المطلوب. لكنك تريد الاحتفاظ بالوصفة الأصلية. هذا يعني أنه في هذه المهمة يجب ألا يُعدَّل وسيط الوصفة.
const recipe = {
noodles: 200,
sauce: 0.5,
mozzarella: 1,
meat: 100,
};
scaleRecipe(recipe, 4);
// =>
// {
// noodles: 400,
// sauce: 1,
// mozzarella: 2,
// meat: 200,
// };
console.log(recipe);
// =>
// {
// noodles: 200,
// sauce: 0.5,
// mozzarella: 1,
// meat: 100,
// };
سجّل في Exercism لتتعلّم وتتقن JavaScript عبر 37 مفهومًا159 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.