85

在整个网络上,我看到大量 JavaScript 程序员在编写window.location,而不仅仅是location. 我很好奇是否有人可以解释原因。window是全局对象,因此没有必要包含——不是吗?我的意思是,你看不到人们写window.Math.flooror new window.Date(),所以我很好奇为什么它会被指定为location.

我知道这location被认为是您所在窗口的“属性”,我认为这是有道理的。但即便如此,我看不出有任何理由指定全局对象;首先是不可能覆盖location的,除非重定向页面。

那么,这只是一个已经使用了很长时间的怪癖,以至于它已经与我们编写 JavaScript 的方式集成在一起,还是有一些切实的理由这样做呢?我查了谷歌,但唉,我什么都没想到......

4

9 回答 9

91

我总是window.location在我的代码中使用,主要有两个原因:

  1. 尽可能避免使用全局变量是一个好习惯。使用window.前缀提醒我变量是全局的,而其他变量不是。
  2. Javascript 范围的性质允许您覆盖在范围树上设置的变量。这意味着您可以var location在包含范围内的某个位置进行设置(这不是一个不太可能用作变量名的词),而您将改为使用它。

对我来说,编码时目标的明确性非常重要,因为它可以帮助我避免编写错误,然后在我这样做时帮助我找到它们。

于 2011-01-17T00:34:00.783 回答
18

location部分是为了安全,以防有人在范围链中的某处定义变量。使其window.location成为对 的属性的显式引用window

示例:http: //jsfiddle.net/dr6KH/

(function() {
    var location = 'new value'; // creating a local variable called "location"

    (function() {
        alert(location);  // alerts "new value"

        alert(window.location);  // alerts the toString value of window.location
    })();

})();
于 2011-01-17T00:30:24.160 回答
12

window.location和原生对象Math和对象之间有很大的区别Date,即MathDate是原生 JavaScript 对象,它们被指定为作为全局对象的属性存在,而是宿主对象window.location的属性(宿主对象是表示某个方面的对象)环境,由环境提供,不受与原生 JavaScript 对象相同的规则约束。其他宿主对象包括和任何 DOM 元素)。window document

windowin browsers 有两个目的:首先,充当(明确指定的)ECMAScript 全局对象,其次,充当提供有关浏览器环境信息的宿主对象。对于window在其宿主对象容量中的使用,我更喜欢明确并提供window.前缀:没有它的情况下工作的事实location只是来自window精神分裂症性质的巧合。此外,正如其他答案所指出的,这还具有在location当前上下文中存在另一个变量的情况下保护您的优势。

Date不使用前缀或Mathwith的一个很好的理由window.是,这样做会创建在非浏览器环境中不起作用的代码。其他环境通常不提供window全局对象的别名。

于 2011-01-17T10:22:37.197 回答
6

编码的一部分是清晰度。与 Math 或 Date 不同,位置在概念上是窗口的属性,因此包含它的代码变得更加清晰。窗户。” 理想情况下,应删除前缀以进行缩小。

您可能是正确的,很多原因是历史性的。Javascript 在复制和粘贴方面有着悠久的历史。

于 2011-01-17T00:26:47.407 回答
5

这并不总是风格问题——我试图在窗口的加载事件之后通过将脚本元素附加到片段,然后将该片段附加到文档来异步加载社交媒体按钮。Twitter 的 widgets.jslocation.href在多个地方使用,并在 IE 8/9 中导致以下错误:Unexpected call to method or property access。我还没弄清楚为什么,但这只会在通过另一个页面的链接访问该页面时发生。如果您只是将 script 元素附加到 head 或 use window.location.href,则不会发生这种情况,因此 IE 8/9 和createDocumentFragment().

例子:

<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.stackoverflow.com">Tweet</a>
<script>
(function (d, t) {
    var head = document.getElementsByTagName('head')[0];
    var frag = d.createDocumentFragment();
    var s = d.createElement(t);
    s.async = true;
    s.src = 'http://platform.twitter.com/widgets.js';
    frag.appendChild(s);
    head.appendChild(frag);
} (document, 'script'));
</script>
于 2012-12-18T19:48:23.063 回答
3

window对象是默认的工作命名空间,因此location将等于window.location.

我认为使用location有点模棱两可,window.location为了清楚起见。

于 2011-01-17T00:27:15.143 回答
2

这只是风格问题。

从概念上讲,locationwindow(窗口位于某个位置)的属性,与Mathor不同Date

于 2011-01-17T00:23:51.433 回答
1

location 是window对象的一个​​属性,所以可以通过请求window.location来获取。但是,如果您不指定对象,JavaScript 会假定您需要 window 对象。所以仅仅请求位置与请求window.location是一样的。

于 2011-01-17T00:27:06.717 回答
0

它们实际上是相同的。从技术上讲,window对象与 Javascript 变量的根范围相同。

于 2011-01-17T00:24:44.890 回答