Потому что с window.foo
вы явно ищете foo
объект window
объект, которого нет в последнем варианте. В последнем варианте, если foo
не определен, вы должны как разработчик знать, что он не определен, и получить ясное предупреждение об ошибке, а не интерпретатор, установив его на undefined
самостоятельно (например, в первом случае), который приведет до неожиданно результаты.
Reference Error:
Представляет ошибку при ссылке несуществующей переменной. При попытке разыменовать переменную, которая не была объявлена, возникает ссылка ReferenceError.
Взгляните на эту статью для получения дополнительной информации:
Цитируя выше статьи:
Справочное считается неразрешимой если его базовая стоимость не определено. Поэтому ссылка на свойство неразрешима, если значение до точки не определено. В следующем примере вы будете бросать ReferenceError, но это происходит не потому, что TypeError попадает туда первым. Это связано с тем, что базовое значение свойства подчиняется CheckObjectCoercible (ECMA 5 9.10 по 11.2.1), который бросает TypeError при попытке преобразовать Undefined type в Object.
Примеры:
var foo;
foo.bar; //TypeError (base value, foo, is undefined)
bar.baz; //ReferenceError (bar is unersolvable)
undefined.foo; //TypeError (base value is undefined)
Ссылка, которые не являются ни свойством или переменных, по определению неразрешимого и выбросят ReferenceError, так:
foo; //ReferenceError
'window.foo' не эквивалентен' var foo'. –
@TimDown. можете ли вы подробнее рассказать? может быть, в ответ? – gdoron
@TimDown & @gdoron Хорошо, это немного неверно - я имел в виду, что window.foo эквивалентен 'var foo', объявленному в глобальном контексте. – JKing