Приведите практическое применение замыкания и классический баг с ним.
Практическое: счётчик или кэш, состояние которого не должно быть доступно снаружи, фабрика функций, вообще всё, что обязано помнить значение между вызовами. Классический баг — for (var i = 0; ...) setTimeout(() => console.log(i)), печатающий последнее значение каждый раз, потому что все колбэки замкнуты на одну привязку. let создаёт новую привязку на итерацию и это чинит.