2011-04-06 62 views
1

我见过用window.global_name定义的全局变量。 我想知道为什么不直接使用global_name,即使这个脚本将在闭包中运行。“窗口”总是在JavaScript范围链的顶部?

UPD:好像IE不明确将其添加到窗口对象,当你把它声明封闭

+3

只要是肛门,窗口并不总是在JavaScript中的作用域链的顶端。例如,在服务器端的Node应用程序中,根本没有窗口。 – 2011-04-06 18:46:40

+0

这是正确的:) – noxvile 2011-04-06 18:48:07

+0

事件更多的肛门然后:只有在DOM脚本(即:文档对象模型中的JavaScript,实际上是浏览器)窗口位于作用域链的顶部。 Javascript/Ecmascript可以在很多(无窗口)环境中运行 – KooiInc 2011-04-06 19:10:55

回答

0

他们有类似的效果,但window让你的内部明确声明,你是故意使用全球。否则,读者不知道它是否是var在范围链的更上方,你只是忘记了声明它等。

0

除非你引入另一个范围,通过在功能包装你的代码,window === this === <the global scope> 然而,windowthis有,你可以使用数组语法(window['something']),这样你就可以访问全局变量,即使你有他们的名字只在一个字符串,而无需使用像eval恶事的优势。

1

window.x比简单地x安全,如果可能存在可能是另一个x在当前或前面的作用域。话虽如此,即使window不是傻瓜证明,因为你可以定义一个名为window的变量。

+1

您不能在Firefox或Chrome中重新声明'window'。 – 2011-04-06 18:23:49

+1

@Matthew Flaschen:'function x(){var window = 10;警报(窗口); } x(); FF4中的'alerts'10'。 – casablanca 2011-04-06 19:48:50

+0

对不起,你是对的;您可以在更局部的范围内重新声明它。但是,你不能在全球范围内这样做。 – 2011-04-06 20:05:47

0

答案是。如果声明了一个没有var关键字(在函数内)的变量,该变量将隐式成为window对象的成员,该对象将自动由浏览器初始化。

外部的功能,具有或不具有var关键字,变量隐含变为window对象的成员。

2

任何ECMAScript环境中作用域链上的最后一个对象始终是全局对象。在浏览器中,window是所有意图和目的的全球对象。如果要访问全局对象x或全局变量x(它们几乎但不完全相同)的属性,则应该明确地使用window.x来限定它,以避免可能将x解析为另一个对象的属性在范围链上,或globalObj.x,如果你关心的是对非浏览器环境的可移植性。您可以从任何地方ECMAScript中3个非严格的ECMAScript 5到全局对象的引用如下:

var globalObj = (function() { return this; })();