Javascript 为什么我们要在全局变量前面加“window.”?

Javascript 为什么我们要在全局变量前面加“window.”?,javascript,global-variables,Javascript,Global Variables,在我在互联网上看到的许多代码示例中,全局变量(如innerWidth,onresize,navigator)分别被编写为window.innerWidth,window.onresize,window.navigator) 为什么有些全局变量前面有窗口。,而另一些全局变量,例如文档和控制台通常没有前缀 编辑: 我知道OOP是如何工作的,我正在访问窗口对象的各种属性。我不是JavaScript的新手。如果我的问题不清楚,我很抱歉。我已经用JS编程多年了,但从未质疑过这个约定,因此我提出了这个问题

在我在互联网上看到的许多代码示例中,全局变量(如
innerWidth
onresize
navigator
)分别被编写为
window.innerWidth
window.onresize
window.navigator

为什么有些全局变量前面有
窗口。
,而另一些全局变量,例如
文档
控制台
通常没有前缀

编辑:

我知道OOP是如何工作的,我正在访问
窗口
对象的各种属性。我不是JavaScript的新手。如果我的问题不清楚,我很抱歉。我已经用JS编程多年了,但从未质疑过这个约定,因此我提出了这个问题


本质上,我是在问为什么我们不把
窗口
放在
文档
之前,而把它放在
内部宽度
之前。这仅仅是一个清晰的问题吗?理论上,如果没有
窗口,我就不能引用任何全局变量。
前缀并且没有问题吗?

将其视为对象。您正在尝试获取
窗口
对象的
innerWidth
<代码>文档也是这样。您试图获取描述
文档本身的变量,而不是整个
窗口。而
console
就是这样一个控制台,您可以
console.log
来调试它。它也有自己的特性


它们可能是全局变量,但它们仍然属于并描述您必须首先调用的特定“对象”。如果有意义的话。

这很不幸,但是浏览器中的
窗口
引用了一个对象,它代表两个逻辑上不同的概念:

  • 对象的一个实例,该对象具有定义良好的属性,例如,逻辑映射到浏览器的窗口(或者更确切地说,现在是选项卡,但该区别从脚本中隐藏)
  • 将所有全局变量作为属性附加到的对象
语义上,不使用
Window作为与窗口概念无关的全局变量的前缀更为简洁。

现在请注意,当您引用全局特定变量(如
myThing
)时,这会带来一个问题:很难知道您是否有意引用全局变量,或者它是否在某个中间范围内声明(或者您只是忘了用var声明变量)。这会导致一种情况,即您将不使用
窗口。
仅用于窗口实例的属性,也用于特定的全局变量。当然,在实践中,您将尽可能避免全局变量

不使用
窗口作为前缀。
还有一个优点,当您忘记
var
声明或库导入时,可以使代码以不微妙的方式快速失败(这比以难以调试的方式在生产中失败要好):


区分这两个概念(如
global
root
作为节点),JavaScript可能会更好。

所有全局函数和变量都附加到对象激活器,该对象依赖于主机环境(浏览器、节点等),在浏览器环境中,对象激活器是窗口对象,因此每个全局函数都可以通过
window.console
this.console
或仅仅是
console
访问,我认为前置代码对于具有更可读性的代码非常有用


您可以访问全局范围的变量,而无需窗口前置,只要
innerWidth

您需要读取MDN,这些对象非常容易理解。窗口是您的浏览器窗口,控制台是您的控制台,文档是页面文档。@SterlingArcher我认为问题不在于每个变量代表什么。相反,为什么
窗口
有时被用作名称空间。@JonathanLonowski是的。”…为什么我们不把
窗口
放在
文档
之前,但我们把它放在
内部宽度
之前……“为什么人们对全局的
未定义的
进行冗长的安全检查,但对其他全局的
却不进行检查?谁知道呢。我当然不知道。人们会做一些奇怪的事情。“难道我不能在没有窗口的情况下引用任何全局变量吗?前缀和没有问题吗?”前提是没有同名的局部变量。所以这只是惯例问题?
window.undeclaredVariable // no error, just an undefined value
undeclaredVariable // reference error