关于 Javascript 范围解析

On Javascript scope resolution

在控制台上,当您输入

blahblah 并回车,你应该会得到 Unrecognized ReferenceError.

但是……

当您输入 this.blahblah 时,您会得到 undefined(表示没有错误)

这是为什么?

blahblah什么时候在内存中为自己找到一个space并赋予它特殊的值(undefined)? - 看起来,当我执行 this.blahblah 时,它具有即时执行 var blahblah; 的效果。

有意见吗?

第一个未声明,第二个未定义。由于 this 在浏览器中引用 window,解释器试图找到它的 属性 blahblah 但失败了,所以 returns undefined .

您可以通过尝试查找未定义变量的 属性(例如 bluh.blahblah)来验证没有自动创建任何变量。您将再次收到 undeclared 错误,因为 bluh 不会在任何范围内找到。

在阅读时访问不存在的对象成员 returns undefined 因为当时的语言 "designed" 就是那样。

如果您为它赋值,那么您就是在创建成员。

当使用非本地标识符时,语言会访问全局 window 对象,但首先会检查该成员是否实际存在,否则会报错。这很奇怪,但接受它……就是这样,因为它就是这样。没有任何逻辑上的道理。

如果您认为这有问题,请做好更糟糕的准备。逻辑并不是 Javascript 语言真正重要的部分。您应该记住 Javascript 在设计时确实没有得到任何认真的考虑(基本上它是在一夜之间创建的)并且作为一种语言,它几乎是可怕的。

然而,互联网大爆炸将其固化在当前的悲惨状态,并且它不会以不兼容的方式 "fixed" 因为改变它只会破坏整个万维网。通常 "standards" 是经过大量思考和实验后定义的,但这并没有发生在 Javascript 上,标准化的是一夜之间的黑客攻击。

享受真正美妙的运行时环境(HTML5 浏览器、node js)并在编写代码时多加注意。

PS:甚至不要使用或查看有关 == 在 Javascript 中做什么的规范。简直是废话。

this.blahblah 的情况下,您指的是 this 对象的 属性window你的情况)。

在 JavaScript 中,当您尝试获取一个不存在的 属性 对象时,它将 return 一个 undefined 类型。

然而,在第一种情况下,简单地调用 blahblah,您正在尝试调用一个具有名为 blahblah 的引用的对象。如果不存在,JavaScript 将抛出 ReferenceError

JavaScript 有很多方法可以告诉您某物不存在。

写入控制台时也可以这样做

obj
Uncaught ReferenceError: obj is not defined(…)

var obj = {a: 1}
obj.b
undefined

with this - 你指的是全局对象