Урок 01

Объявление функций

В 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. Не поднимается.

Разница в поведении

DeclarationExpressionArrow
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