我见过用window.global_name定义的全局变量。 我想知道为什么不直接使用global_name,即使这个脚本将在闭包中运行。“窗口”总是在JavaScript范围链的顶部?
UPD:好像IE不明确将其添加到窗口对象,当你把它声明封闭
我见过用window.global_name定义的全局变量。 我想知道为什么不直接使用global_name,即使这个脚本将在闭包中运行。“窗口”总是在JavaScript范围链的顶部?
UPD:好像IE不明确将其添加到窗口对象,当你把它声明封闭
他们有类似的效果,但window
让你的内部明确声明,你是故意使用全球。否则,读者不知道它是否是var
在范围链的更上方,你只是忘记了声明它等。
除非你引入另一个范围,通过在功能包装你的代码,window === this === <the global scope>
然而,window
和this
有,你可以使用数组语法(window['something']
),这样你就可以访问全局变量,即使你有他们的名字只在一个字符串,而无需使用像eval
恶事的优势。
window.x
比简单地x
安全,如果可能存在可能是另一个x
在当前或前面的作用域。话虽如此,即使window
不是傻瓜证明,因为你可以定义一个名为window
的变量。
您不能在Firefox或Chrome中重新声明'window'。 – 2011-04-06 18:23:49
@Matthew Flaschen:'function x(){var window = 10;警报(窗口); } x(); FF4中的'alerts'10'。 – casablanca 2011-04-06 19:48:50
对不起,你是对的;您可以在更局部的范围内重新声明它。但是,你不能在全球范围内这样做。 – 2011-04-06 20:05:47
答案是是。如果声明了一个没有var
关键字(在函数内)的变量,该变量将隐式成为window
对象的成员,该对象将自动由浏览器初始化。
外部的功能,具有或不具有var
关键字,变量隐含变为window
对象的成员。
任何ECMAScript环境中作用域链上的最后一个对象始终是全局对象。在浏览器中,window
是所有意图和目的的全球对象。如果要访问全局对象x
或全局变量x
(它们几乎但不完全相同)的属性,则应该明确地使用window.x
来限定它,以避免可能将x
解析为另一个对象的属性在范围链上,或globalObj.x
,如果你关心的是对非浏览器环境的可移植性。您可以从任何地方ECMAScript中3个非严格的ECMAScript 5到全局对象的引用如下:
var globalObj = (function() { return this; })();
只要是肛门,窗口并不总是在JavaScript中的作用域链的顶端。例如,在服务器端的Node应用程序中,根本没有窗口。 – 2011-04-06 18:46:40
这是正确的:) – noxvile 2011-04-06 18:48:07
事件更多的肛门然后:只有在DOM脚本(即:文档对象模型中的JavaScript,实际上是浏览器)窗口位于作用域链的顶部。 Javascript/Ecmascript可以在很多(无窗口)环境中运行 – KooiInc 2011-04-06 19:10:55