当我尝试使用未声明的变量时,我得到ReferenceError
。
console.log(a);
Uncaught ReferenceError: a is not defined
我可以先使用变量并稍后定义它,因为吊装不会出现问题。
console.log(a);
var a;
undefined
但是当我声明一个对象时,执行上下文为什么会让我使用它的任何属性。
var obj = {};
console.log(obj.a);
console.log(obj.why);
undefined
undefined
为什么即使a
和why
从未在任何地方声明,也允许这些?
答案 0 :(得分:3)
因为对象属性不是变量。规则不同。访问不存在的对象属性会为您提供undefined
,而不是错误。这就是语言设计的方式。
差异的一个可能的解释除了“Eich设计它的方式”之外,还有声明对象属性。你只需要使用它们。但是必须声明变量(The Horror of Implicit Globals除外,我们现在没有严格的模式)。
答案 1 :(得分:2)
语言设计已指定尝试访问对象上不存在的属性只会返回undefined
。
var obj = {};
console.log(obj.a); // undefined
但是,尝试访问当前或父范围内未定义的变量是ReferenceError。
console.log(b); // ReferenceError
为什么这些都被允许,即使a和为什么永远不会被宣布 任何地方?
这就是语言的设计方式。我可以看到它有这样一些原因,但决定以这种方式制作的真正原因只是在一些原始设计师的头脑中。我们目前的工作是了解它的工作原理并编写与当前设计兼容的代码(因为我们无法更改当前的语言设计)。
有很多方法可以通过测试这些未定义的变量来解决这个问题,例如:
if (typeof b === "undefined")
或者,如果您在浏览器中并且期望b
是全局的,则可以使用全局变量附加到window
对象并且缺少对象属性的事实不要像这样创建ReferenceErrors:
console.log(window.b); // undefined