2

当我尝试使用未声明的变量时,我得到ReferenceError

console.log(a); // Uncaught ReferenceError: a is not defined

我可以先使用一个变量,然后再定义它,这不会因为提升而成为问题。

console.log(a); // undefined

var a;

但是当我声明一个对象时,为什么执行上下文会让我使用它的任何属性?

var obj = {};

console.log(obj.a); // undefined
console.log(obj.why); // undefined

为什么这些是允许的a,并且why从未在任何地方声明过?

4

2 回答 2

4

因为对象属性不是变量。规则不同。访问不存在的对象属性会给您undefined,而不是错误。这只是语言的设计方式。

除了“这就是 Eich 的设计方式”之外,对这种差异的一种可能解释是您没有声明对象属性。你只需使用它们。但是必须声明变量(除了隐式全局变量的恐怖,我们现在没有这个,现在我们有严格模式)。

于 2015-08-09T07:39:30.767 回答
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
于 2015-08-09T07:47:37.263 回答