Урок 5 из 8 · 20 мин · обновлено

Функции и области видимости

Как объявлять функции и стрелочные функции, передавать параметры и возвращать результат, и где «видна» переменная, объявленная внутри блока.

Зачем нужны функции

Если одно и то же действие нужно в нескольких местах программы, его оформляют как функцию: описывают один раз, дают имя и вызывают, когда нужно. Если правило поменяется, исправлять придётся одно место, а не десять. Вы уже пользовались готовыми функциями — console.log() и Number().

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

JavaScript
function greet(name) {
  console.log(`Здравствуйте, ${name}!`);
}

greet("Анна");   // Здравствуйте, Анна!
greet("Иван");   // Здравствуйте, Иван!
  • function — ключевое слово;
  • greet — имя функции;
  • name — параметр, входные данные;
  • код в фигурных скобках выполняется только при вызове.

Параметру можно задать значение по умолчанию:

JavaScript
function greet(name, greeting = "Здравствуйте") {
  console.log(`${greeting}, ${name}!`);
}

greet("Анна");             // Здравствуйте, Анна!
greet("Иван", "Привет");   // Привет, Иван!

return: вернуть результат

Функция может не только что-то сделать, но и вернуть результат:

JavaScript
function withDiscount(price) {
  return price * 0.9;
}

const total = withDiscount(1000) + 300;
console.log(total);   // 1200

Не путайте return и console.log(). console.log() только показывает значение в консоли, а return отдаёт его программе — в переменную, в расчёт, в другую функцию. Если в функции нет return, она возвращает undefined.

return также сразу завершает функцию:

JavaScript
function checkAge(age) {
  if (age < 18) {
    return "Доступ запрещён";
  }
  return "Добро пожаловать";
}

Стрелочные функции

Для коротких функций есть сокращённая запись:

JavaScript
const double = (n) => n * 2;
const sum = (a, b) => a + b;

console.log(double(5));   // 10
console.log(sum(2, 3));   // 5

Если тело — одно выражение, return и фигурные скобки не нужны: значение вернётся само. Стрелочные функции вы будете встречать постоянно, особенно в уроке 7, где функции передают в методы массивов.

Области видимости

Переменные, объявленные через let и const, видны только внутри своего блока — фигурных скобок:

JavaScript
if (true) {
  const message = "Привет";
  console.log(message);   // Привет
}
console.log(message);     // ReferenceError: message is not defined

То же с функциями: переменные внутри функции снаружи не видны.

JavaScript
function calc() {
  const result = 42;
  return result;
}

const value = calc();   // 42 — значение получили через return

А вот изнутри видно то, что объявлено снаружи:

JavaScript
const rate = 0.9;

function withRate(price) {
  return price * rate;   // rate доступна внутри функции
}

Это правило защищает от путаницы: функции не перезаписывают переменные друг друга, даже если имена совпадают. Хорошая привычка — объявлять переменную там, где она нужна, а не «на всякий случай» в начале программы.

Попробуйте сами. Напишите функцию orderTotal(prices, discount = 0), которая принимает список цен и скидку в процентах и возвращает итог. Пока перебирайте цены циклом for...of. Проверьте: orderTotal([450, 150, 300]) → 900, orderTotal([450, 150, 300], 10) → 810.

Решение
JavaScript
function orderTotal(prices, discount = 0) {
  let total = 0;
  for (const price of prices) {
    total += price;
  }
  return total * (100 - discount) / 100;
}

console.log(orderTotal([450, 150, 300]));       // 900
console.log(orderTotal([450, 150, 300], 10));   // 810

[450, 150, 300] — это массив, список значений. Подробно о массивах — в следующем уроке, а в уроке 7 эту же сумму посчитаем в одну строку.

Мини-тест: проверьте себя

Закрепите урок: несколько вопросов, разбор ответов — в конце.

  1. Что вернёт функция, в которой нет return?

  2. Какая запись — стрелочная функция, которая возвращает удвоенное число?

  3. Что выведет код: if (true) { const message = 'Привет'; } console.log(message);

  4. Как вызвать function greet(name, greeting = 'Привет'), чтобы получить «Привет, Анна»?