如果我在网页上打开JavaScript控制台并添加变量:
window
JavaScript将该属性附加到window.abc
对象,因此我可以简单地通过abc
或直接访问console.log(window.abc)
console.log(abc)
来访问对象
window
现在,如果我尝试通过console.log(window.notdefinedyet)
> undefined
对象访问尚未定义的内容
console.log(notdefinedyet)
它只是返回未定义。所以如果我这样做
undefined
为什么这是错误,而不仅仅是{{1}}?
答案 0 :(得分:6)
因为尝试读取未声明的标识符的值是ReferenceError。从根本上说,这与尝试从对象不具有的属性中读取属性是不同的操作。
尝试使用未声明的标识符通常是一个错误(例如,错字)。这就是为什么ES5的严格模式使得为未声明的标识符分配ReferenceError的原因(而不是旧的行为-仍处于宽松模式以实现向后兼容-在其中创建新的全局变量,我称之为The Horror of Implicit Globals)。 / p>
一个人可能会(有很多人认为)试图从一个对象所不具有的属性中获取属性也是一个错误。但是在这种情况下,获取undefined
而不是错误通常非常有用。是否有人同意这种区分,这就是定义JavaScript的方式。
可能值得切记的是,这种在全局对象上创建属性的全局变量声明业务是为保持向后兼容性而必须保留的旧有行为,但与TC39语言设计的当前思想不一致(委员会落后于JavaScript标准)。较新的结构,例如let
,const
和class
即使在全局范围内使用,也不会在全局对象上创建属性(尽管它们确实创建了全局变量):
var a = 1;
let b = 2;
console.log("a" in window); // true
console.log("b" in window); // false
console.log(a); // 1
console.log(b); // 2
答案 1 :(得分:0)
它总是检查引用,因此console.log(notdefinedyet)给出了一个错误,但是在console.log(window.notdefinedyet)的情况下,窗口仅在没有定义键的情况下引用了对象类型。