关于 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
- 你指的是全局对象
在控制台上,当您输入
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
- 你指的是全局对象