在Javascript中引用窗口对象的目的是什么?

时间:2012-01-27 23:57:14

标签: javascript

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一样使代码更加冗长吗?这样做有一些我不了解的理由吗?

3 个答案:

答案 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中描述。)