2012-04-11 3 views
6

В javascriptwindow - это глобальный объект, что означает, что каждый объект в глобальной области действия является дочерним элементом window. Так почему я получаю этот результат:ReferenceError и глобальный объект

console.log(window.foo); // No error, logs "undefined". 
console.log(foo);  // Uncaught ReferenceError: foo is not defined. 

Fiddle

Эти две линии должны быть одинаковыми, а не они?

ответ

17

Потому что с 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 
2

В вашем первом примере (window.foo) вы получаете доступ к свойству объекта window. JavaScript возвращает «undefined», когда вы пытаетесь получить доступ к несуществующему свойству объекта. Это так.

Во втором примере вы ссылаетесь на переменную напрямую, и поскольку она не существует, возникает ошибка.

Это именно то, как JavaScript разработан и работает.

1

В JavaScript можно назначить объектные поля на лету, так что window.foo - почти (см. комментарии ниже) эквивалент var foo;, если он определен в глобальном контексте,, в то время как просто вызов foo вносит изменения в браузер, так как он даже не знает, к какому объекту обратиться. Обратите внимание, если вы выполните:

//when in global context, 'var' sets a property on the window object 
var foo; 

console.log(foo); 
//it will then also log `undefined` instead of throwing the error. 

//if you then do: 
foo = "abbazabba"; 

console.log(window.foo); 
// it will return "abbazabba" 
+1

'window.foo' не эквивалентен' var foo'. –

+0

@TimDown. можете ли вы подробнее рассказать? может быть, в ответ? – gdoron

+0

@TimDown & @gdoron Хорошо, это немного неверно - я имел в виду, что window.foo эквивалентен 'var foo', объявленному в глобальном контексте. – JKing

Смежные вопросы