javascript对象的奇怪行为

时间:2015-08-09 07:38:04

标签: javascript

当我尝试使用未声明的变量时,我得到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

为什么即使awhy从未在任何地方声明,也允许这些?

2 个答案:

答案 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