window.location与只是位置

时间:2011-01-17 00:21:42

标签: javascript location window.location

在网络上,我看到大量的JavaScript程序员正在编写window.location而不是location。我很好奇是否有人可以提供解释原因。 window是全局对象,因此没有必要包括 - 不是吗?我的意思是,你没有看到人们写window.Math.floornew window.Date(),所以我很好奇为什么会用location来指定。

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

那么,这只是一个长期使用的怪癖,它与我们编写JavaScript的方式相结合,还是有一些切实的理由以这种方式做事?我查了谷歌,但是唉,我什么都没想出来......

9 个答案:

答案 0 :(得分:66)

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

  1. 尽可能避免全局变量是一个好习惯。使用window.前缀提醒我变量是全局变量而其他变量不是。
  2. Javascript的作用域的性质允许您覆盖范围树上方设置的变量。这意味着您可以在包含范围内的某处设置var location(这不是一个不太可能被用作变量名称的词),而是您正在研究它。
  3. 对我而言,编码时目的明确非常重要,因为它可以帮助我避免编写错误,然后帮助我找到它们。

答案 1 :(得分:14)

部分是为了安全,以防有人在范围链中的某处定义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
    })();

})();

答案 2 :(得分:9)

window.location与原生MathDate对象之间存在很大差异,MathDate是指定的本机JavaScript对象作为全局对象的属性存在,而window.locationwindow 主机对象的属性(主机对象是表示环境某些方面的对象,由环境,并且不受与本机JavaScript对象相同的规则的限制。其他主机对象包括document和任何DOM元素。

浏览器中的

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

不为locationDate添加Math前缀的一个好理由是,这样做会创建在非浏览器环境中无效的代码。其他环境通常不提供window.作为全局对象的别名。

答案 3 :(得分:6)

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

你可能是正确的,很多原因都是历史性的。 Javascript具有复制和粘贴的广泛历史。

答案 4 :(得分:5)

这并不总是风格问题 - 我试图在窗口加载事件后异步加载社交媒体按钮,方法是将脚本元素附加到片段,然后将该片段附加到文档中。 Twitter的widgets.js在几个地方使用location.href并在IE 8/9中导致以下错误:对方法或属性访问的意外调用。我还没弄清楚原因,但只有在通过其他页面的链接访问该页面时才会发生这种情况。如果您只是将脚本元素附加到头部或使用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>

答案 5 :(得分:3)

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

我认为使用location有点含糊不清,为了清晰起见,请使用window.location

答案 6 :(得分:2)

这只是风格问题。

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

答案 7 :(得分:1)

location是window对象的属性,因此您可以通过请求window.location来获取它。但是,如果您没有指定对象,则JavaScript假定您需要窗口对象。因此,请求位置与请求window.location相同。

答案 8 :(得分:0)

它们实际上是相同的。从技术上讲,"window"对象与Javascript变量的根作用域相同。