Функции
Объявление
function greet(name) {
return `Привет, ${name}`;
}
greet('Алиса');
Такие функции поднимаются (hoisting) — можно вызывать до объявления.
Функциональное выражение
const greet = function(name) {
return `Привет, ${name}`;
};
Не поднимается.
Стрелочные функции
const greet = (name) => `Привет, ${name}`;
Короткие:
const double = (x) => x * 2;
const noArgs = () => 42;
const oneArg = x => x * 2; // скобки можно опустить
Возврат объекта — в скобках:
const makeUser = (name) => ({ name });
Разница со стрелочными
- Нет своего
this - Нет
arguments - Нельзя использовать
new - Не поднимаются
this внутри стрелочной — от окружающего контекста:
const obj = {
name: 'Алиса',
greet() {
const inner = () => this.name; // this = obj
return inner();
},
};
Параметры
Значения по умолчанию
function greet(name = 'Гость') {
return `Привет, ${name}`;
}
Rest
function sum(...numbers) {
return numbers.reduce((a, b) => a + b, 0);
}
sum(1, 2, 3);
Деструктуризация
function print({ name, age }) {
console.log(name, age);
}
print({ name: 'Алиса', age: 25 });
Со значениями по умолчанию:
function print({ name = 'Гость', age = 0 } = {}) {}
Возврат
function add(a, b) {
return a + b;
}
Без return функция возвращает undefined.
Несколько значений:
function minMax(arr) {
return [Math.min(...arr), Math.max(...arr)];
}
const [min, max] = minMax([1, 2, 3]);
Объект:
function getUser() {
return { name: 'Алиса', age: 25 };
}
const { name } = getUser();
Функции как значения
const add = (a, b) => a + b;
const ops = { add, sub: (a, b) => a - b };
ops.add(1, 2);
Callback
function process(items, callback) {
items.forEach(callback);
}
process([1, 2, 3], (n) => console.log(n));
IIFE
Немедленный вызов:
(function() {
console.log('сразу');
})();
Стрелочная:
(() => {
console.log('сразу');
})();
Используется редко в современном коде.
Чистые функции
Функция без побочных эффектов, возвращающая один и тот же результат при одинаковых аргументах:
// Чистая
const add = (a, b) => a + b;
// Не чистая
let total = 0;
const addToTotal = (n) => { total += n; };
Чистые легче тестировать и отлаживать.
Функции высшего порядка
Принимают или возвращают функции:
const multiply = (a) => (b) => a * b;
const double = multiply(2);
double(5); // 10
Итоги
- Объявление, выражение, стрелочные
- Стрелочные не имеют своего
this - Параметры: дефолты, rest, деструктуризация
- Возврат объекта — в скобках
- Функции — значения
- Чистые функции предпочтительны