window.x和x有什么区别?

Gim*_*imm 3 javascript

假设“ x”是一个从未定义的变量,因此它应该是未定义的。在以下情况下:
1)

if(x){//do something}
//ReferenceError: x is not defined
Run Code Online (Sandbox Code Playgroud)

2)

if(window.x){//do something}
//worked as expected
Run Code Online (Sandbox Code Playgroud)

据我所知,在这里的浏览器环境中,x应该与window.x相同,有人可以帮助指出此处不同行为的原因吗?

bfa*_*tto 6

x仅与window.x声明时相同(自然而然地在全局范围内)。这可以通过var在全局范围内使用显式语句来完成,也可以通过不带var任何范围的简单赋值来完成(这被视为隐式全局声明):

var a; // declares global a
function foo() {
    b = 10; // declares (implict) global b
}
Run Code Online (Sandbox Code Playgroud)

双方ab也将作为window.awindow.b在Web浏览器。

这还会在浏览器上创建一个全局变量:

window.c = 20; // can be accessed as just c
Run Code Online (Sandbox Code Playgroud)

现在,尝试访问不存在的变量将引发ReferenceError,而尝试访问不存在的对象属性只会返回未定义。

有趣的事实:与创建全局var不能与被删除delete操作,而隐含的全局和那些为全球对象可以的属性创建。