为什么我们用`window`预先设置全局变量?

时间:2014-11-10 15:24:55

标签: javascript global-variables

在互联网上看到的很多代码示例中,innerWidthonresizenavigator等全局变量都写成window.innerWidth,{分别为{1}},window.onresize

为什么其中一些全局变量前置window.navigator而其他变量前缀(例如window.document通常没有预先添加?

编辑:

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

从本质上讲,我要求为什么我们不会在window之前放置window.,但我们会将其放在document之前。这只是一个清晰的问题吗?从理论上讲,我不应该引用没有innerWidth前缀的任何全局变量并且没有问题吗?

3 个答案:

答案 0 :(得分:5)

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

  • Window的一个实例,一个具有明确定义属性的对象,如Window.innerWidth,逻辑映射到您的浏览器窗口(或者更确切地说是今天的标签,但这种区别对您来说是隐藏的脚本)
  • 将所有全局变量作为属性附加到的global object

从语义上讲,不要将与Window概念无关的全局变量加上window.作为前缀。

现在请注意,当您引用全局特定变量myThing时,这会引入一个问题:如果您有意识地引用全局变量或者它是否真的很难知道它是什么? ; s在某个中间范围内声明(或者如果你忘了用var声明变量)。这导致您不仅仅使用window.作为Window实例的属性而且还使用特定全局变量的情况。当然,在实践中,你应尽可能地避免全局变量。

当您忘记window.声明或库导入时,不使用var作为前缀也有优势,使您的代码以非微妙的方式快速失败(这比生产中的失败更好)以难以调试的方式):

window.undeclaredVariable // no error, just an undefined value
undeclaredVariable // reference error

通过区分这两个概念(如节点中的globalroot),JavaScript可能会更好。

答案 1 :(得分:1)

所有全局函数和变量都附加到对象激活器,此对象依赖于您的主机环境(浏览器,节点等),在浏览器环境中对象激活器是窗口对象,因此每个全局函数都可以访问使用window.consolethis.consoleconsole时,我认为前缀对于获得更易读的代码非常有用。

您可以访问全局范围的变量,而窗口不会仅包含innerWidth

答案 2 :(得分:-1)

把它想象成对象。您正试图将innerWidth对象的window作为自己。 Document也是一样的。您试图获取那些描述document本身而不是window整体的变量。而console只是你console.log调试的控制台。它也有自己的属性。

它们可能是全局变量,但它们仍属于并描述特定的"对象"你必须先打电话。如果这是有道理的。