Объявления через let и const ограничивают переменную в блочной области видимости, через var - в области видимости функции. Если переменная не была объявлена ни на месте ни выше и происходит присваивание, то она становится свойством глобального объекта, например window. В строгом режиме будет выброшена ошибка. Если переменная была объявлена в глобальной области видимости через var - то она тоже становится свойством глобального объекта, если через let и const то не становится. В общем и целом - создавать переменные в глобальной области видимости стоит только в самом крайнем случае.