window
对象的每个属性都是全局变量。这意味着您可以执行以下操作:
window.foo = 42;
alert(foo); //alerts 42
var bar = 3;
alert(window["bar"]); //alerts 3
因此,我一直想知道在这样的代码中引用window
的目的是什么
if(window.prompt("Enter Password") === "secret") {
window.location.hash = "authorized";
window.open("secretPage.html");
}
当你可以省略window
并且代码完全相同时:
if(prompt("Enter Password") === "secret") {
location.hash = "authorized";
open("secretPage.html");
}
使用似乎也不一致;我几乎从未见过window.alert
,但我会经常看到window.location
。
人们就像引用window
一样使代码更加冗长吗?这样做有一些我不了解的理由吗?
答案 0 :(得分:5)
有助于显式化的一种情况是,在函数内部将立即清除您打算修改全局变量。例如:
function blah() {
// a bunch of code preceding...
test = "aha!";
}
有人忘了用test
声明var
吗?或者这是对全球的故意修改?比较:
function blah() {
// a bunch of code preceding...
window.test = "aha!";
}
现在,它立即清楚意图是什么。当然,你知道,首先应该避免使用全局变量,但是你明白我的观点。
答案 1 :(得分:2)
窗口是隐含的,但在可能的情况下避免歧义是很好的代码实践。
答案 2 :(得分:2)
我认为它通常用于避免与封闭闭包中的其他变量发生潜在冲突。此外,如果您在没有显式对象的情况下访问全局属性,那么像jslint这样的样式检查器会引发错误(除window
本身等知名属性外。)
也就是说,在浏览器中,当您进入多个窗口时,例如,使用iframe等,您可能需要显式传递对窗口对象的引用。 (如果你真的关心细节,那么窗口对象,或者至少是对它的引用,都是非常特殊的,甚至不能在标准的javascript中描述。)