Возвращаемое значение (return)
Автор конспекта: Бадалова Елена
Продолжаем изучение функций.
Поведение функции
Некоторые функции не возвращают существенное значение после завершения, их основная цель — выполнить какое-либо действие.
То есть, функция выполняет свою логику, но не обязательно выдает внешний результат.
Примеры
alert()- выполняет действие (показывает диалоговое окно), но ничего не возвращает.console.log()- выполняет действие (выводит информацию в консоль), но не возвращает значения для дальнейшего присвоения или использования.
Проблема дублирования кода
Для получения значения firstName и lastName приходится писать похожий код.
Инкапсуляция логики
Функции могут инкапсулировать сложную или повторяющуюся логику, делая код более читаемым и легким для модификации.
Преимущества инкапсуляции:
-
Уменьшение дублирования кода. Мы пишем логику только один раз, а затем переиспользуем эту функцию, значительно сокращая объем кода.
-
Упрощение модификации и поддержки. Если в будущем потребуется изменить или добавить дополнительное поведение функции, достаточно внести изменения только в одном месте.
-
Универсальность и повторное использование. Создание универсальных функций устраняет необходимость создавать отдельные, почти идентичные функции для каждого элемента, приводя к более эффективному и менее избыточному коду.
Область видимости переменных (Scope)
Глобальная область видимости
Глобальные переменные - это переменные, объявленные вне функций. Они доступны везде.
Если переменная объявлена как глобальная, то при обращении к ней внутри функции, браузер сначала ищет эту переменную внутри самой функции. Если переменная не найдена внутри функции, то браузер выходит за пределы функции и начинает искать ее во внешней области видимости, где может найти глобальную переменную и использовать ее.
Локальная область видимости
Локальные переменные - это переменные, объявленные внутри блока (функции, цикла, условия),
имеют локальную область видимости. Они доступны только в пределах этого блока и его дочерних
элементов.
Если попытаться обратиться к такой переменной снаружи функции, она будет undefined.
Локальные переменные являются важным инструментом для инкапсуляции данных внутри функций, предотвращая конфликты имен и делая функции более модульными и переиспользуемыми.
Унификация функций
Если функции выполняют похожие действия и отличаются только входными данными (например, ID элемента), эти данные можно передавать как параметры.
Возвращаемые значения
Очень часто возникает необходимость, чтобы функция не просто выполняла действие, но и возвращала результат, который может зависеть от переданных параметров.
В основном, возвращаемое значение используется там, где функция является чем-то вроде вспомогательного звена при вычислениях. Вы хотите получить результат, который включает в себя некоторые значения. Эти значения вычисляются функцией, которая возвращает результат так, что он может быть использован в следующих стадиях вычисления.
Оператор return
Если нужно не просто логировать значение, а получить его, чтобы потом использовать по своему
усмотрению (например, вывести в alert или присвоить другой переменной), функция должна вернуть это
значение.
Это достигается с помощью оператора
return.
При вызове оператора return в функции её выполнение прекращается. Указанное значение возвращается
в место вызова функции.
Если возвращаемое значение не указано, вместо него возвращается undefined.
Использование синтаксиса return позволяет функциям быть более универсальными, предоставлять
данные для дальнейшей обработки и инкапсулировать логику, что способствует более чистому и
модульному коду.
Возвращение значения из функции
Оптимизация функции document.getElementById()
🏠Домашнее задание
Часть 1
Работа с инпутами, функциями и DOM-манипуляциями
Закрепляем тему функций... Тяжело будет! Держитесь!
Задания
- Создать 3 инпута для ввода текста.
- Написать
JS, который найдёт эти 3 элемента и запишет в них ваше имя (например: «Дима», «Дима», «Дима»). - Ниже написать JS-код, который найдёт эти 3 элемента и запишет в них вашу фамилию.
- Как результат выполнения программы мы увидим в 3-х инпутах вашу фамилию.
- Потом снова вставить кусок кода из пункта 2 ниже кода из пункта 3 (грех №1 — дублирование кода).
- Обернуть код из пункта 2 в функцию setMyNameToAllInputs.
- Заменить вызовы кода из пункта 2 на вызовы функции setMyNameToAllInputs.
- Инкапсулировать логику из пункта 3 в функцию setMyLastNameToAllInputs, которая найдёт эти инпуты и запишет в них фамилию.
- Вызвать функцию setMyLastNameToAllInputs();
- Кода стало меньше, теперь мы можем переиспользовать функции многократно.
- Видим, что функции очень похожи → дублирование кода.
- Сделать функции максимально похожими друг на друга (убрать дублирование внутри).
Пример:
- Аналогично переделать функцию для фамилии.
- Отличие функций — в значении внутренней переменной:
- Написать универсальную функцию changeValue(newValue), которая принимает параметр и меняет значения у всех инпутов:
- Закомментировать функции
setMyNameToAllInputsиsetMyLastNameToAllInputsи использовать универсальную:
- Добавить в CSS класс error:
- Написать код, который найдёт все 3 инпута с помощью getElementById и каждому добавит класс
error. - Видим дублирование кода.
- Написать функцию setError(id), которая принимает id, находит элемент и добавляет ему класс
error. - Использовать функцию вместо кода из пункта 18.
- Добавить в разметку отдельные
divиtextareaс id, вызвать функцию:
Результат: у обоих элементов красная рамка.
- Написать функцию getSumm, которая возвращает сумму двух чисел.
- Посчитать несколько сумм:
- Создать функцию sayHello, которая вызывает
alert('My name'). - Вызвать её через setTimeout:
- Попробовать вызвать setError через setTimeout. Нужно создать обёртку:
- 4 способа спрятать элемент:
display: none;visibility: hidden;width: 0pxилиheight: 0pxleft: -1000000000px(илиtop)- есть и другие (например
opacity: 0)
- Написать функцию hideElement(id), которая прячет элемент по id.
- Написать функцию showElement(id), которая делает противоположное.
- setInterval работает как setTimeout, но повторяется каждые N миллисекунд. Сделать счётчик от 0 до бесконечности каждую секунду, выводить результат в инпут.
- В функцию
getSummпередать строки:
Без приведения типов результат будет некорректным. Используем Number(a) и Number(b), чтобы
получить правильный результат.
Часть 2
Работа с функциями для управления DOM-элементами
Продолжаем вырывать мозг, решая задачи по функциям
Задания
- Создать функцию, которая будет удалять элемент по id. Использовать метод
.remove().
- Создать функцию, которая принимает 2 параметра: id элемента и название css-класса. Функция должна находить элемент и добавлять к нему переданный класс.
- Создать функцию, которая будет прятать элемент по id, уменьшая его width. Используем CSS-свойство
transitionи дополнительный класс сwidth: 0px;.
- Аналогичная функция для показа элемента (убираем класс).
- Создать функцию, которая принимает массив html-элементов и удаляет те, у которых
.value === "2".
- Аналогичная функция, но удаляет элементы с
.value === "3".
- Избавляемся от дублирования: пишем универсальную функцию, которая принимает значение
valueForDelete.
- Создать функцию, которая принимает массив элементов и удаляет те, у которых есть css-класс
"hey".
- Создать функцию
hasClassHey, которая принимает элемент и возвращаетtrue, если у него есть класс"hey", иначе —false.
- Создать функцию
removeElementIfConditionsTrue, которая принимает массив элементов и функцию-предикат. Если предикат вернётtrue, элемент удаляется.
Пример использования:
Часть 3
Небольшие пояснения
Ну и финальный закреп нелёгкой темы ФУНКЦИИ
- Функция должна работать только с теми переменными, которые у неё объявлены внутри. Если функции нужно что-либо из “внешнего” мира, то это что-то должно передаваться во время вызова функции как параметр.
Плохой вариант (используем внешнюю переменную)
Переделаем так (передаём значение параметром):
Задания
Мы запускаем какую-то функцию doSommething и хотим, чтобы она в конце, когда отработает, сообщила нам о своём завершении, вызвав нашу другую callback-функцию. Где функция doSommething возьмёт такую callback? Мы передадим её параметром.


