3

假设“x”是一个从未定义的变量,所以它应该是未定义的。在以下场景中:
1)

if(x){//do something}
//ReferenceError: x is not defined

2)

if(window.x){//do something}
//worked as expected

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

4

2 回答 2

6

x只会与window.x声明的相同(自然是在全局范围内)。这可以通过var全局范围内的显式语句或没有任何范围的简单赋值来完成var(这被认为是隐式全局声明):

var a; // declares global a
function foo() {
    b = 10; // declares (implict) global b
}

两者a和也b将在网络浏览器中提供。window.awindow.b

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

window.c = 20; // can be accessed as just c

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

有趣的事实:创建的全局变量var不能用deleteoperator删除,而隐式全局变量和作为全局对象属性创建的全局变量可以。

于 2013-05-07T02:08:17.657 回答
3

JavaScript(作为核心语言)不提供任何方式来访问包含所有全局变量(“全局环境”)的对象,但它仍然存在。在 Web 浏览器中,全局环境有一个名为window(还有self,也许还有top)的变量,它引用全局上下文。

window.window.self.top.window.top.window.x如果你喜欢,你可以打字。:)

因此,在没有本地var xvar y定义的上下文中,此代码

x = 42;
window.y = 17;

…将在全局上下文中分配两个变量,这段代码:

console.log(window.x);
console.log(y);

…将从全局上下文中读取值。

JavaScript(如 Lua 和 Ruby)允许您设置全局变量的值,而无需将变量预定义为全局变量。(但是请注意,这在 ECMAScript5 严格模式中是不允许的。)

但是,JavaScript(与 Lua 和 Ruby 不同)明确不允许您访问未设置的全局变量(请参阅ECMAScript 5 规范第 8.7.1 节,第 3 步。)这样做是为了稍微保护您在输入错误时不会意外读取全局变量。在 Lua 中,您可以编写:

myLongNamedGlobalVariable = 42   -- assign to a global variable
print(myLongNamedGlobalVeriable) --> nil   (wtf!)

并没有意识到你打错了。在 JavaScript 中,您会受到 ReferenceError 的保护。

于 2013-05-07T02:08:21.547 回答