在互联网上看到的很多代码示例中,innerWidth
,onresize
,navigator
等全局变量都写成window.innerWidth
,{分别为{1}},window.onresize
。
为什么其中一些全局变量前置window.navigator
而其他变量前缀(例如window.
和document
通常没有预先添加?
编辑:
我知道OOP如何工作以及我正在访问console
对象的各种属性。我不是JavaScript的新手。如果我的问题可能不清楚,我很抱歉。我已经在JS编程了多年,但从未质疑过这个约定,因此我的问题。
从本质上讲,我要求为什么我们不会在window
之前放置window.
,但我们会将其放在document
之前。这只是一个清晰的问题吗?从理论上讲,我不应该引用没有innerWidth
前缀的任何全局变量并且没有问题吗?
答案 0 :(得分:5)
很不幸,但浏览器中的window
引用了一个代表两个逻辑上不同概念的对象:
从语义上讲,不要将与Window概念无关的全局变量加上window.
作为前缀。
现在请注意,当您引用全局特定变量myThing
时,这会引入一个问题:如果您有意识地引用全局变量或者它是否真的很难知道它是什么? ; s在某个中间范围内声明(或者如果你忘了用var声明变量)。这导致您不仅仅使用window.
作为Window实例的属性而且还使用特定全局变量的情况。当然,在实践中,你应尽可能地避免全局变量。
当您忘记window.
声明或库导入时,不使用var
作为前缀也有优势,使您的代码以非微妙的方式快速失败(这比生产中的失败更好)以难以调试的方式):
window.undeclaredVariable // no error, just an undefined value
undeclaredVariable // reference error
通过区分这两个概念(如节点中的global
或root
),JavaScript可能会更好。
答案 1 :(得分:1)
所有全局函数和变量都附加到对象激活器,此对象依赖于您的主机环境(浏览器,节点等),在浏览器环境中对象激活器是窗口对象,因此每个全局函数都可以访问使用window.console
,this.console
或console
时,我认为前缀对于获得更易读的代码非常有用。
您可以访问全局范围的变量,而窗口不会仅包含innerWidth
。
答案 2 :(得分:-1)
把它想象成对象。您正试图将innerWidth
对象的window
作为自己。 Document
也是一样的。您试图获取那些描述document
本身而不是window
整体的变量。而console
只是你console.log
调试的控制台。它也有自己的属性。
它们可能是全局变量,但它们仍属于并描述特定的"对象"你必须先打电话。如果这是有道理的。