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

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

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

скрипка

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

3 ответа

Решение

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

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

Представляет ошибку при ссылке на несуществующую переменную. Ошибка ReferenceError вызывается при попытке разыменования переменной, которая не была объявлена.

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

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

Ссылка считается неразрешимой, если ее базовое значение не определено. Поэтому ссылка на свойство неразрешима, если значение перед точкой не определено. В следующем примере будет генерироваться ReferenceError, но это не так, потому что TypeError попадает туда первым. Это связано с тем, что базовое значение свойства зависит от CheckObjectCoercible (ECMA 5 9.10 - 11.2.1), который выдает ошибку TypeError при попытке преобразовать неопределенный тип в объект.

Примеры:

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) вы получаете доступ к свойству объекта окна. JavaScript возвращает "неопределенное", когда вы пытаетесь получить доступ к несуществующему свойству объекта. Это разработано таким образом.

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

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

В 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" 
Другие вопросы по тегам