При доступе к неопределенной глобальной переменной всегда выдается.Доступ к неопределенному свойству объекта всегда будет возвращать undefined
.Тот факт, что window является псевдонимом для global, не меняет здесь правил, при доступе к неопределенному члену window будет возвращено undefined
.
Что касается того, почему второй пример не выдает, потому что все var
s подняты во вложенную область независимо от того, где они появляются, и до того, как какой-либо код будет выполнен в этой области.Это означает, что переменная JSON
определена, даже если var
не выполняется, она будет содержать undefined
.var
делает две вещи, создает переменную в области видимости и, необязательно, инициализирует переменную.Создание переменной поднимается в верхнюю часть области видимости, назначение выполняется там, где она появляется.Все переменные содержат undefined
, пока им не будет присвоено значение.Если задание не выполнено, оно останется undefined
.Дубликаты var
в той же области игнорируются.Это означает, что если JSON
уже находится в области видимости, var
игнорируется.
Это не глупая вещь IE, все реализации JavaScript, соответствующие ES5, должны следовать правилам, которые я изложил выше.