if...else
Автор конспекта: Андрей Шамара
Оптимизация JavaScript и условные конструкции
Этот раздел посвящен улучшению и оптимизации JavaScript кода, а также введению в условные
конструкции if-else-if-else.
Начальный код
index.html
index.js
Ключевые темы
1. Сокращение дублирования кода и глобальные переменные
Глобальные переменные могут быть "злом" в больших проектах! Используйте их с осторожностью.
- Проблема дублирования: Изначально в коде четыре функции-слушателя, выполняющие схожие
действия, что приводит к повторению кода, особенно в части получения элементов
DOMпо ихID.
- Решение (Глобальные переменные): Объявление переменных
input1иinput2за пределами функций делает их глобальными. Это позволяет избежать повторного поиска элементовDOMвнутри каждой функции.
- Нюанс: Глобальные переменные увеличивают вероятность
коллизий имени усложняют отладку. В данном контексте это было приемлемым упрощением для демонстрации. - Проверка после рефакторинга: Важно всегда проверять работоспособность приложения после каждого шага рефакторинга.
Коллизия имён в JavaScript — это конфликт имён переменных или функций, который возникает из-за
дублирования имён в разных файлах кода. Это может привести к ошибкам, например, к тому, что код
принял функцию с другим именем, а не с тем, которое было указано в исходном коде.
2. Динамическое получение значений (проблема value и number)
- Проблема value: Присвоение value из инпута переменной при загрузке страницы приводит к тому,
что эта переменная содержит пустое значение (
""), которое затем преобразуется в0при попытке математических операций.
операндах будут значения 0- Решение: Значения из инпутов (
numberилиvalue) должны быть получены непосредственно в момент их использования (например, при нажатии на кнопку операции), а не заранее. Это гарантирует актуальность данных.
3. Инкапсуляция получения и преобразования чисел (getNumber функция)
- Проблема: Повторяющийся код для получения значения из DOM-элемента и его преобразования в число.
- Решение: Создание функции
getNumber(например,getNumber1,getNumber2), которая инкапсулирует эти шаги. - return: Оператор
returnвозвращает результат выполнения функции, позволяя использовать его в другом месте кода. - Немедленное использование результата: Вместо сохранения результата функции
getNumberв промежуточную переменную, можно использовать его напрямую в выражении (например,getNumber1() + getNumber2()). Это еще больше сокращает код.
Никогда не используйте функцию eval()! Это создает серьезные уязвимости безопасности.
Больше деталей о возможностях смотрите в документации eval()
4. Универсальная функция для операций (makeOperations)
- Проблема: Дублирование логики для различных математических операций (
сложение,вычитание,умножение,деление) в разных функциях-обработчиках событий. - Решение: Создание одной универсальной функции
makeOperations, которая принимаетoperationCode(строку, представляющую операцию) в качестве параметра и использоватьif-else-if-elseконструкции для создания разветвленной логики. - Параметры функции: Параметры позволяют функции адаптировать свое поведение в зависимости от входных данных.
- Оператор сравнения
===: Три знака равенства===используются для строгого сравнения (значение и тип). - Логика: Программа перестает быть полностью линейной и начинает выполнять разные
веткикода в зависимости от условий. - Обработка неизвестных операций: Добавление финального
elseдля обработки случаев, когдаoperationCodeне соответствует ни одному из ожидаемых значений.
5. Отладка с помощью DevTools
- Точки останова (
Breakpoints): Позволяют приостановить выполнение кода в определенной строке и исследовать состояние переменных. Полезно для понимания потока выполнения и отладкиif-elseлогики.

Больше деталей о возможностях смотрите в документации Отладка в браузере
6. Дальнейшие улучшения (один слушатель событий)
- Идея: Вместо четырех отдельных слушателей событий для каждой кнопки, можно использовать один слушатель, который будет определять, какая кнопка была нажата, и извлекать символ операции непосредственно из текста или атрибута кнопки. Это будет рассмотрено в следующем уроке.


