Объявление функций
В JavaScript несколько способов объявить функцию. У каждого свои особенности.
Function declaration
function greet(name) {
return `Привет, ${name}`;
}
Hoisting: функция доступна до её объявления в коде.
greet('Алиса'); // работает
function greet(name) {
return `Привет, ${name}`;
}
Function expression
const greet = function(name) {
return `Привет, ${name}`;
};
Не поднимается. Вызов до объявления — ошибка.
Именованное выражение:
const factorial = function fact(n) {
return n <= 1 ? 1 : n * fact(n - 1);
};
Имя fact доступно только внутри функции.
Стрелочная функция
const greet = (name) => `Привет, ${name}`;
Не имеет своего this, arguments, new. Не поднимается.
Разница в поведении
| Declaration | Expression | Arrow | |
|---|---|---|---|
| Hoisting | да | нет | нет |
Своё this | да | да | нет |
arguments | да | да | нет |
new | да | да | нет |
prototype | да | да | нет |
Когда что использовать
- Declaration — для функций верхнего уровня в модулях
- Expression — для присваивания в переменную
- Arrow — для callback, методов, где не нужен
this
В современном коде чаще всего стрелочные и declaration.
Функции как значения
const add = (a, b) => a + b;
const ops = { add, sub: (a, b) => a - b };
const fn = add;
fn(1, 2);
Немедленный вызов (IIFE)
(function() {
console.log('сразу');
})();
Стрелочная:
(() => {
console.log('сразу');
})();
Используется для изоляции области видимости. В модулях редко нужно.
Функция как аргумент
function process(items, callback) {
items.forEach(callback);
}
process([1, 2, 3], (n) => console.log(n));
Функция как возвращаемое значение
function multiplier(factor) {
return (n) => n * factor;
}
const double = multiplier(2);
double(5); // 10
Такие функции — основа замыканий (следующие уроки).
Параметры
Значения по умолчанию
function greet(name = 'Гость') {
return `Привет, ${name}`;
}
Rest
function sum(...numbers) {
return numbers.reduce((a, b) => a + b, 0);
}
Деструктуризация
function print({ name, age = 0 } = {}) {
console.log(name, age);
}
print({ name: 'Алиса' });
length
Свойство length — число параметров до первого со значением по умолчанию или rest:
function a(x, y) {} // a.length = 2
function b(x, y = 1) {} // b.length = 1
function c(x, ...rest) {} // c.length = 1
name
Свойство name — имя функции:
function greet() {}
greet.name; // 'greet'
const fn = () => {};
fn.name; // 'fn'
const anon = function() {};
anon.name; // 'anon' — из переменной
Итоги
- Declaration поднимается, expression и arrow — нет
- Стрелочные без своего
this - Функции — значения
- Параметры: дефолты, rest, деструктуризация
- Свойства
lengthиname