Можно по-всякому. Зависит от величичны задач, от масштабности, сложности и пр. Мне нравится идти путём как в ООП, где всё - объект (опять же, если имеет смысл в рамках задачи. Если это единственный код на странице, то зачем усложнять себе жизнь?)
В итоге может быть что-то такое (псевдокод):
class Menu {
const hamburger = document.querySelector('.hamburger'),
const menu = document.querySelector('.menu'),
const closeElem = document.querySelector('.menu__close'),
const overlay = document.querySelector('.menu__overlay');
init() {
this.initListeners();
this.someFunctionsExecutingHere();
this.additionalWork();
}
initListeners() {
this.hamburger.addEventListener('click', this.show);
this.closeElem.addEventListener('click', this.hide);
this.overlay.addEventListener('click', this.hide);
}
show() {
this.menu.classList.add('active');
}
hide() {
this.menu.classList.remove('active');
}
}
(new Menu).init();
либо так же, но чуть сложнее. Т.к. на один click
или другое действие, может быть не одна, а несколько операций, то может быть и так:
class Menu {
const hamburger = document.querySelector('.hamburger'),
const menu = document.querySelector('.menu'),
const closeElem = document.querySelector('.menu__close'),
const overlay = document.querySelector('.menu__overlay');
init() {
this.initListeners();
this.someFunctionsExecutingHere();
this.additionalWork();
}
initListeners() {
this.hamburger.addEventListener('click', this.onHamburgerClick);
this.closeElem.addEventListener('click', this.onCloseClick);
this.overlay.addEventListener('click', this.onOverlayClick);
}
onHamburgerClick() {
this.getDataFromServer();
this.parseData();
this.fillTable();
this.show();
}
onCloseClick() {
this.removeDataFromTable();
this.collapseAllRows();
logger.log(this.operation);
this.hide();
}
show() {
this.menu.classList.add('active');
}
hide() {
this.menu.classList.remove('active');
}
}
(new Menu).init();