Розрізняють функції виду "function declaration statement"і "function definition expression".
Оголошення функції (function declaration statement) складається з наступних частин:
function func(param){ тіло функції
} //'func' - це ім'я функції, їй передається один параметр param:
function func(param1, param2) { тіло функції
}//Передаємо функції два параметри - param1 і param2:
function func() {тіло функції
}//Взагалі не передаємо жодних параметрів:
Функція виду "function declaration statement" за синтаксисом є інструкцією (statement), ще функція може бути виду "function definition expression".
Оголошення функції ("function definition expression"). Така функція може бути анонімною (Вона не має імені). Функції виду "function definition expression" зручні, коли функція передається аргументом іншої функції.
Зверніть увагу на фігурні дужки у прикладах:у них ми пишемо код, який виконує функція. Загальний синтаксис функції має такий вигляд:
function имя_функции(тут перераховуються параметри через кому)
{
Тут написано команди, які виконує функція.
}
var ім'я_змінної=function ім'я_функції(тут перераховуються параметри через кому)
{
Тут написано команди, які виконує функція.
}
Є ще один дуже простий та лаконічний синтаксис для створення функцій, який часто краще, ніж функціональні вирази.
Це називається "стрілочні функції", тому що виглядає так: let func = (arg1, arg2, ...argN) => expression
Це створює функцію, func яка приймає аргументи arg1..argN, потім оцінює expression їх використання праворуч і повертає свій результат.
let sum = (a, b) => a + b;
Найбільш коротка форма для: let sum = function(a, b) { return a + b; };
«Стрілкові функції» бувають двох типів:
Оператор розповсюдження (... spread) або він же оператор залишку (...rest) з'явився у стандарті ECMAScript у 2015-му році. Він спростив ряд типових дій по роботі з масивами, параметрами функцій і став дуже корисним при деструктуризації об'єктів і масивів.

Замініть код Function Expression стрілочною функцією:

Функція друкує 10 випадкових чисел від 1 до 100:

Саму функцію ми можемо викликати у будь-якому місці нашого JavaScript документа (навіть до її визначення). Функція викликається на її імені. При цьому круглі дужки після її імені є обов'язковими, навіть якщо вони порожні. Дивіться приклад:
/* Ми написали функцію,яка виводить на екран 'Привіт, мир!'.Назвемо її 'hello':*/
function hello() {
/*У цьому місці нічого не виведеться саме по собі,а виводиться лише за виклику функції.*/
alert('Привіт, мир!');
}
/* Тепер ми хочемо викликати нашу функцію,щоб вона вивела на екран свою фразу.Звернемося до неї на ім'я: */
hello(); //От і все! Функція виведе на екран фразу 'Привіт, мир!'.
/* Ми можемо вивести нашу фразу кілька разів -для цього достатньо написати функцію не один раз, а кілька:*/ hello(); hello(); hello();
У прикладах ми викликали функцію 'hello()' без параметрів.
Давайте спробуємо ввести параметр, який задаватиме текст, що виводиться нашою функцією:
//Задамо нашу функцію:
function hello(text) { //вкажемо тут параметр text
//Виведемо на екран значення змінної text:
alert(text);
//Тепер викличемо нашу функцію:
hello('Привіт, Земляни!'); //вона виведе саме ту фразу, яку ми їй передали
Зверніть увагу на змінну text у нашій функції: у ній з'являється те, що ми передали у круглих дужках під час виклику функції.
Як JavaScript знає, що текст 'Привіт, Земляни!' Чи потрібно покласти в змінну text? Ми сказали йому про це, коли створювали нашу функцію, ось тут: 'function hello(text)'.
Якщо ми поставимо кілька параметрів -то кожен із них лежатиме у своїй змінній усередині функції.
Найчастіше функція не повинна виводити щось через alert на екран, а повертати.
Зробимо тепер так, щоб функція не виводила щось на екран, а повертала текст скрипту, щоб він зміг записати цей текст у змінну і якось обробити його далі:
//Задамо функцію:
function hello(text) {
/*Вкажемо функції за допомогою інструкції 'return',що ми хочемо, щоб вона ПОВЕРНУЛА текст, а не вивела на екран:*/
return text;
}
//Тепер викличемо нашу функцію і запишемо значення змінну message:
var message = hello('Привіт, Земляни!'); //поки виведення на екран немає
//І тепер у змінній message лежить 'Привіт, Земляни!':
alert(message); //переконаємося у цьому
//Можна не вводити проміжну змінну message, а зробити так:
alert(hello('Привіт, Земляни!'));
В принципі, практичної користі від того, що ми зробили - ніякої, оскільки функція повернула нам те, що ми їй передали. Модернізуємо наш приклад так, щоб функція приймала ім'я людини, а виводила рядок 'Привіт, %ім'я_людини_передане_функції%!':
//Задамо функцію:
function hello(name) { //вкажемо тут параметр name, у якому лежатиме ім'я людини
//Введемо змінну text, у якому запишемо всю фразу:
var text = 'Привіт, '.name.'!';
/*Вкажемо функції за допомогою інструкції 'return',що ми хочемо, щоб вона ПОВЕРНУЛА вміст змінної text:*/
return text;
}
//Тепер викличемо нашу функцію та запишемо значення у змінну message:
var message = hello("Вася");
//І тепер у змінній text лежить 'Привіт, Васю!':
alert(message); //переконаємося у цьому
//Привітаємося разом із групою людей із трьох человек:
alert(hello('Вася').' '.hello('Петя').' '.hello('Коля'));
Після виконання інструкції return – функція закінчить свою роботу. Тобто: після виконання return більше жодного коду не виконається.
Це не означає, що у функції повинен бути один return. Але виконається лише один із них. Така поведінка функцій є причиною численних трудноуловимых помилок.
Дивіться приклад:
function func(param){
/*Якщо змінна param має значення true, то повернемо 'Правильно!'.
Нагадую, що конструкція if(param) еквівалентна if(param === true)!
*/
if (param) return 'Вірно!';
/*Далі новачок JavaScript хоче зробити ще якісь операції,
але якщо змінна param має значення true – спрацює інструкція return,
та код нижче працювати не буде!
Навпаки, якщо param === false – інструкція return не виконається
і код далі працюватиме!
*/
alert('Привіт, мир!');
}
Існують деякі прийоми роботи з return, які спрощують код. Як зробити найпростіше:
function func(param) {
/*Що робить код:якщо param має значення true – то змінну result запишемо 'Вірно!',інакше 'Невірно!':*/
if (param) {
var result = 'Правильно!'
} else {
var result = 'Неправильно!';
}
//Повернемо вміст змінної result:
return result;
}
Тепер спростимо нашу функцію, використовуючи прийом роботи з return:
function func(param) {
/*Що робить код:якщо param має значення true – поверне 'Правильно!',інакше поверне 'Невірно!'.*/
if (param) {
return 'Правильно!'
} else {
return = 'Неправильно!';
}
}
Зверніть увагу, наскільки спростився код. Плюс також є те, що ми прибрали зайву змінну result.
Зворотні функції (callback functions) - це функції, які передаються в інші функції як аргументи і викликаються після завершення певної операції.
Callback-функції дозволяють JavaScript обробляти асинхронні операції. Вони є фундаментальною частиною мови і широко використовуються для:
forEach, map, filter)function greet(name, callback) {
console.log('Привіт, ' + name + '!');
callback(); // Викликаємо callback-функцію
}
function sayGoodbye() {
console.log('До побачення!');
}
greet('Анна', sayGoodbye);
// Виведе:
// Привіт, Анна!
// До побачення!
Зайдіть в браузері інструменти розробника, консоль- там побачите цей результат!!!
const numbers = [1, 2, 3, 4, 5];
// Використання callback у методі forEach
numbers.forEach(function(number) {
console.log(number * 2);
});
// Виведе: 2, 4, 6, 8, 10
Зайдіть в браузері інструменти розробника, консоль- там побачите цей результат!!!
const squared = numbers.map(function(num) {
return num * num;
});
console.log(squared); // Виведе: [1, 4, 9, 16, 25]
Зайдіть в браузері інструменти розробника, консоль- там побачите цей результат!!!
// Імітація асинхронного запиту до сервера
function fetchData(callback) {
setTimeout(function() {
const data = { id: 1, name: 'Тестовий об\'єкт' };
callback(data);
}, 1000);
}
fetchData(function(result) {
console.log('Отримані дані:', result);
});
console.log('Запит відправлено...');
// Виведе:
// Запит відправлено...
// (через 1 секунду) Отримані дані: {id: 1, name: "Тестовий об'єкт"}
Часто в Node.js використовується патерн "error-first callback", де перший параметр callback-функції - це об'єкт помилки.
function divide(a, b, callback) {
if (b === 0) {
callback(new Error('Ділення на нуль неможливе'));
} else {
callback(null, a / b);
}
}
divide(10, 2, function(err, result) {
if (err) {
console.error('Помилка:', err.message);
} else {
console.log('Результат:', result);
}
});
divide(10, 0, function(err, result) {
if (err) {
console.error('Помилка:', err.message);
} else {
console.log('Результат:', result);
}
});
Callback-функції - це потужний інструмент в JavaScript, який дозволяє:
Однак при роботі з багатьма callback-функціями може виникнути "callback hell" (пекло callback-ів). Для боротьби з цим існують проміси (Promises) та async/await.
Ще приклади зворотніх функцій.


Функція changeWord(str,fn) приймає два параметри: рядок, який вона перетворює на масив слів і функцію, яка перетворює слова за алгоритмом функції-параметра, наприклад, переводить літери слів у верхній режим.

Або можна записати код, використовуючи функції-стрілки.


Функція результатом може повертати іншу функцію. Можна використовувати внутрішню функцію, а результатом, наприклад, може бути анонімна функція.
Нижче наведено приклад сценарію, в якому описано функцію, що повертає результатом функцію поліноміального типу (Поліном другого порядку). Аргументами вихідної функції передаються три числові коефіцієнти, що визначають поліном, а результатом є функція, що обчислює значення полінома з зазначеними коефіцієнтами в точці, що визначається аргументом функції-результату.

У вирішенні завдань використовувати callback-функції та функції - стрілки.
Дан рядок,який містить тільки однозначні числа (число обмежене пробілами):

Дан рядок,який містить числа(число обмежене пробілами)знайти:

Дан рядок,який містить не тільки числа (слова обмежені пробілами):

Дан рядок,який містить не тільки числа (слова обмежені пробілами):
