ReferenceError и глобальный объект

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

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

скрипка

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

Ответы на вопрос(3)

В первом примере (window.foo) вы получаете доступ к свойству объекта window. JavaScript возвращает & quot; неопределенный & quot; когда вы пытаетесь получить доступ к несуществующему свойству объекта. Он спроектирован таким образом.

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

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

Решение Вопроса

Потому что сwindow.foo вы явно ищетеfoo собственностьюwindow объект, который не имеет место в последнем варианте. В последнем варианте, еслиfoo не определено, вы, как разработчик, должны знать, что он не определен, и получать четкое предупреждение об ошибке, а не интерпретатор, устанавливающий его вundefined сам по себе (как в первом случае), который приведет кunexpected Результаты.

Ошибка ссылки:

Represents an error when a non-existent variable is referenced. A ReferenceError is thrown when trying to dereference a variable that has not been declared.

Взгляните на эту статью для получения дополнительной информации:

Understanding JavaScript’s ‘undefined’

Цитирую сверху статью:

A Reference is considered unresolvable if its base value is undefined. Therefore a property reference is unresolvable if the value before the dot is undefined. The following example would throw a ReferenceError but it doesn’t because TypeError gets there first. This is because the base value of a property is subject to CheckObjectCoercible (ECMA 5 9.10 via 11.2.1) which throws a TypeError when trying to convert Undefined type to an Object.

Examples:

var foo;
foo.bar; //TypeError (base value, foo, is undefined)
bar.baz; //ReferenceError (bar is unersolvable)
undefined.foo; //TypeError (base value is undefined)

References which are neither properties or variables are by definition unresolvable and will throw a ReferenceError, So:

foo; //ReferenceError

В JavaScript вы можете назначить поля объекта на лету так,window.foo являетсяnearly (see comments below) эквивалентноvar foo; when defined in the global context, тогда как просто звонит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" 
 11 апр. 2012 г., 11:26
Это все еще не совсем эквивалентно. Например, можно удалить свойство глобального объекта, которое было явно установлено (послеwindow.foo = "bar";, delete window.foo; удаляетfoo собственность и возвратtrue) тогда как невозможно удалить переменную (послеvar foo = "bar";, delete window.foo; ничего не делает и возвращаетсяfalse).
 11 апр. 2012 г., 11:41
Я полагаю, вы пытаетесь сделать это в консоли, что меняет ситуацию, потому что консоль используетeval() и код выполняется сeval() ведет себя немного иначе, чем код, выполняемый нормально. Попробуйте вместо этого на тестовой странице.
 gdoron11 апр. 2012 г., 11:10
@TimDown. не могли бы вы уточнить еще, пожалуйста? может быть в ответе?
 11 апр. 2012 г., 11:09
window.foo не эквивалентноvar foo.
 11 апр. 2012 г., 13:33

Ваш ответ на вопрос