Почему ссылка на несуществующее свойство объекта в javascript не возвращает опорную ошибку?

Если я попытаюсь ссылаться на несуществующую переменную, я получаю ReferenceError в JavaScript. Почему ссылка на несуществующее свойство объекта возвращает 'undefined'? Вот какой код, если я пишу его в браузере:

alert(a);
ReferenceError: a is not defined //error is thrown
alert({}.a)
undefined //no error

Ответы

Ответ 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.