当我尝试使用一个未声明的变量时,我得到了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从来没有在任何地方声明过,但为什么允许这样做呢?
发布于 2015-08-09 07:47:37
语言设计已经指定,尝试访问对象上不存在的属性只会返回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-09 07:39:30
因为对象属性不是变量。规则是不同的。访问不存在的对象属性将给您提供undefined,而不是错误。语言就是这样设计的。
除了“这是Eich设计它的方式”之外,还有一个可能的解释是,您不需要声明对象属性。你就用它们吧。但是必须声明变量(除了http://blog.niftysnippets.org/2008/03/horror-of-implicit-globals.html之外,我们现在没有严格的模式)。
https://stackoverflow.com/questions/31901994
复制相似问题