Урок 5 из 8 · 20 мин · обновлено
Функции и области видимости
Как объявлять функции и стрелочные функции, передавать параметры и возвращать результат, и где «видна» переменная, объявленная внутри блока.
Зачем нужны функции
Если одно и то же действие нужно в нескольких местах программы, его оформляют как функцию: описывают один раз, дают имя и вызывают, когда нужно. Если правило поменяется, исправлять придётся одно место, а не десять. Вы уже пользовались готовыми функциями — console.log() и Number().
Объявление функции
function greet(name) {
console.log(`Здравствуйте, ${name}!`);
}
greet("Анна"); // Здравствуйте, Анна!
greet("Иван"); // Здравствуйте, Иван!
function— ключевое слово;greet— имя функции;name— параметр, входные данные;- код в фигурных скобках выполняется только при вызове.
Параметру можно задать значение по умолчанию:
function greet(name, greeting = "Здравствуйте") {
console.log(`${greeting}, ${name}!`);
}
greet("Анна"); // Здравствуйте, Анна!
greet("Иван", "Привет"); // Привет, Иван!
return: вернуть результат
Функция может не только что-то сделать, но и вернуть результат:
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 также сразу завершает функцию:
function checkAge(age) {
if (age < 18) {
return "Доступ запрещён";
}
return "Добро пожаловать";
}
Стрелочные функции
Для коротких функций есть сокращённая запись:
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, видны только внутри своего блока — фигурных скобок:
if (true) {
const message = "Привет";
console.log(message); // Привет
}
console.log(message); // ReferenceError: message is not defined
То же с функциями: переменные внутри функции снаружи не видны.
function calc() {
const result = 42;
return result;
}
const value = calc(); // 42 — значение получили через return
А вот изнутри видно то, что объявлено снаружи:
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.
Решение
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 эту же сумму посчитаем в одну строку.
Мини-тест: проверьте себя
Закрепите урок: несколько вопросов, разбор ответов — в конце.
-
Что вернёт функция, в которой нет return?
Если функция ничего не возвращает явно, результатом её вызова будет undefined. Вывод через console.log() — это не возврат значения.
-
Какая запись — стрелочная функция, которая возвращает удвоенное число?
Стрелочная функция записывается как (параметры) => выражение. Если тело — одно выражение, его значение возвращается автоматически.
-
Что выведет код: if (true) { const message = 'Привет'; } console.log(message);
let и const видны только внутри своего блока — фигурных скобок. Снаружи такой переменной не существует.
-
Как вызвать function greet(name, greeting = 'Привет'), чтобы получить «Привет, Анна»?
У параметра greeting есть значение по умолчанию, поэтому его можно не передавать.