Функція - це блок організованого коду, який можна використовувати повторно і який виконує певну дію. У 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 без значення або взагалі не має інструкції return, її результат дорівнює undefined.
У JavaScript немає неявного return.
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 вправ та справжнє наставництво від людей, і все це безкоштовно.