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