假设“x”是一个从未定义的变量,所以它应该是未定义的。在以下场景中:
1)
if(x){//do something}
//ReferenceError: x is not defined
2)
if(window.x){//do something}
//worked as expected
据我所知,在这里的浏览器环境中,x 应该与 window.x 相同,有人可以帮忙指出这里不同行为的原因吗?
假设“x”是一个从未定义的变量,所以它应该是未定义的。在以下场景中:
1)
if(x){//do something}
//ReferenceError: x is not defined
2)
if(window.x){//do something}
//worked as expected
据我所知,在这里的浏览器环境中,x 应该与 window.x 相同,有人可以帮忙指出这里不同行为的原因吗?
x
只会与window.x
声明的相同(自然是在全局范围内)。这可以通过var
全局范围内的显式语句或没有任何范围的简单赋值来完成var
(这被认为是隐式全局声明):
var a; // declares global a
function foo() {
b = 10; // declares (implict) global b
}
两者a
和也b
将在网络浏览器中提供。window.a
window.b
这也会在浏览器上创建一个全局变量:
window.c = 20; // can be accessed as just c
现在,尝试访问不存在的变量会引发ReferenceError,而尝试访问不存在的对象属性只会返回 undefined。
有趣的事实:创建的全局变量var
不能用delete
operator删除,而隐式全局变量和作为全局对象属性创建的全局变量可以。
JavaScript(作为核心语言)不提供任何方式来访问包含所有全局变量(“全局环境”)的对象,但它仍然存在。在 Web 浏览器中,全局环境有一个名为window
(还有self
,也许还有top
)的变量,它引用全局上下文。
window.window.self.top.window.top.window.x
如果你喜欢,你可以打字。:)
因此,在没有本地var x
或var 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 的保护。