Урок 07

Функции

Объявление

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, деструктуризация
  • Возврат объекта — в скобках
  • Функции — значения
  • Чистые функции предпочтительны