ReferenceError и глобальный объект
В javascript
window
является глобальным объектом, что означает, что каждый объект в глобальной области видимости является дочерним 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"