JavaScript中undefined和window.undefined有什么区别?

6
如果a未定义,那么这个代码可以正常工作:
if(window.a) {}

虽然这会抛出一个错误:

if(a)

有人能解释一下为什么吗?

1个回答

10

window.awindow 的一个属性,它的值是 未定义 的。 a 是一个变量,它是 未声明 的。

要使用一个变量,应该先使用 var 语句声明它。由于你没有声明 a,解释器会抛出一个错误。对象的属性不需要显式地声明才能使用它们。 Crockford 在 The Good Parts 中写道:

如果你试图从一个对象中提取一个值,并且这个对象没有该名称的成员,它会返回 未定义 值。


1
然而:"window.a = 2; a" -- 不需要使用'var'。只是当“未加前缀”的标识符查找运行时,如果没有链接的作用域可供查找,则会引发异常。最后一个检查的上下文是全局上下文(或'window')。对于大多数实际目的,全局上下文中的'var x'与'window.x = undefined'相同。请参见http://jibbering.com/faq/faq_notes/closures.html并查看“标识符解析,执行上下文和作用域链”。 - user166390
@pst:这是浏览器中的一个特殊情况,所有全局变量都是window对象的属性。这是JavaScript的一个独立问题。如果在非浏览器环境下运行window.a = 2; a,比如Rhino,你仍然会得到引用错误。 - viam0Zah
@pst:无论如何,感谢您在澄清答案方面的补充。 - viam0Zah
只是为了进一步澄清,如果您在全局范围内或独立函数调用中运行 this.a = 2; a,它将在任何环境中都能正常工作。仍然存在一个全局对象,只是它并不总是被称为 window - Matthew Crumley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接