关于Javascript范围解析

时间:2015-11-20 07:18:39

标签: javascript scope this

在控制台上,当您输入

blahblah然后按Enter键,您可以获得Unrecognized ReferenceError

但......

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

为什么?

blahblah何时在内存中为自己找到一个空间,以便为其分配特殊值(undefined)? - 看起来,当我执行this.blahblah时,它具有即时执行var blahblah;的效果。

有任何意见吗?

4 个答案:

答案 0 :(得分:6)

对于this.blahblah,您指的是this对象的属性(在您的情况下为window)。

在JavaScript中,当您尝试获取对象的非现有属性时,它将返回undefined类型。

然而,在第一种情况下,只调用blahblah,您尝试使用名为blahblah的引用调用对象。如果不存在,JavaScript将抛出ReferenceError

JavaScript有许多方法告诉你某些东西不存在。

答案 1 :(得分:1)

写入控制台

时也可以这样做
obj
Uncaught ReferenceError: obj is not defined(…)

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

this - 您正在引用全局对象

答案 2 :(得分:0)

第一个是未声明的,第二个未定义。由于this引用浏览器中的窗口,解释器会尝试查找它的属性blahblah并失败,因此返回undefined

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

答案 3 :(得分:0)

访问不存在的对象的成员只会在阅读时返回undefined,因为语言是"设计的"那样。

如果您为其指定了一个值,那么您就可以创建该成员。

当使用非本地标识符时,语言访问全局window对象,但首先检查该成员是否实际存在,否则给出错误。这很奇怪,但只是接受它...就是这样,因为它是这样的。没有坚实的逻辑原因。

如果你认为这是值得怀疑的话,那就做好准备吧。逻辑不是Javascript语言的重要组成部分。你应该记住,Javascript在设计时并没有给出任何认真的想法(基本上它是在一夜之间创造出来的),作为一种语言,它几乎是可怕的。

然而,互联网大爆炸却在当前悲惨的状态下巩固了它,并且它不会被修复和#34;以不相容的方式改变它只会破坏整个万维网。通常"标准"经过大量的思考和实验后确定了这一点,但这并没有发生在Javascript和标准化的过程中,这是一夜之间的黑客行为。

只需享受真正出色的运行时环境(HTML5浏览器,节点js),并在编写代码时付出很多关注。

PS:不要使用或查看有关==在Javascript中所做的内容的规范。这只是胡说八道。