Ответ 1
Вот как работает язык. Его объектно-ориентированный подход очень гибкий, и вы можете динамически добавлять, обновлять и удалять свойства из объектов во время выполнения. Доступ к тому, который в настоящее время не существует, должен давать undefined
вместо повышения исключения. Это, например, позволяет проверять наличие и тип в одном выражении:
if (prop in obj && typeof obj[prop] == "function") obj[prop]();
// can be written shorter:
if (typeof obj[prop] == "function") obj[prop]();
Вы можете получить значение, не используя его. Используя undefined
, тогда он выкинет в большинстве случаев.
Напротив, переменные объявляются статически в своей области. Доступ к необъявленной переменной всегда является ошибкой, которая легитимирует бросание ReferenceError
s.