Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';在Javascript中引用窗口对象的目的是什么?_Javascript - Fatal编程技术网

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

什么';在Javascript中引用窗口对象的目的是什么?,javascript,Javascript,窗口对象的每个属性都是全局变量。这意味着您可以执行以下操作: 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.o

窗口
对象的每个属性都是全局变量。这意味着您可以执行以下操作:

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");
}
当您可以省略
窗口
并让代码执行完全相同的操作时:

if(prompt("Enter Password") === "secret") {
  location.hash = "authorized";
  open("secretPage.html");
}
使用也似乎不一致;我几乎从未见过
窗口.警报
,但我会经常看到
窗口.位置


人们是否喜欢引用
窗口
,使代码更加冗长?我不知道这样做有什么好的理由吗?

窗口是隐式的,但最好的代码实践是尽可能避免歧义。

我认为它通常用于避免与封闭闭包中的其他变量发生潜在冲突。此外,如果在没有显式对象的情况下访问全局属性(除了众所周知的属性,如
window
本身),则jslint之类的样式检查器将引发错误


也就是说,在浏览器中,当您进入多个窗口时,例如使用iframe等,您可能需要显式传递对窗口对象的引用。(如果你真的关心细节,窗口对象,或者至少是对它的引用,是非常特殊的,甚至不能用标准的javascript来描述。)

在一种情况下,它有助于显式化,那就是在一个函数中,你要修改一个全局变量,这一点很明显。例如:

function blah() {
    // a bunch of code preceding...
    test = "aha!";
}
是否有人忘记用
var
声明
test
?或者这是对全球战略的有意修改?比较:

function blah() {
    // a bunch of code preceding...
    window.test = "aha!";
}

现在,我们马上就清楚了它的意图。当然,你知道,首先应该避免使用全局变量,但你明白我的意思。

避免歧义会很好,但我不确定我是否明白它是如何产生歧义的。假设你编写了一个函数“open”,它除了打开一个新窗口之外还做了其他事情?或者可能是导入的外来js文件污染了全局命名空间。。那么最好使用完全限定的引用并尝试执行
window.open()
这将导致错误,因为
window.open
已被覆盖。污染全局命名空间的外来js文件将更改预期行为,无论您使用的是
open
还是
window.open
。Peter Olson,我在测试后对您的评论投了赞成票。这两种情况下窗口都被污染是正确的,即使像Gareth问的那样有一个局部变量。@Gareth:如果有一个名为
window
的局部变量呢?
window
只是全局对象的一个属性。这很有趣,因为这意味着
window===window.window.window.window.window.window
yes这是真的。使用
alert()
window.alert()
窗口都无所谓。窗户。window.alert()
。(
eval()
是一个例外)在全局范围内,您也可以使用
this.alert()