window.location与仅位置


79

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

我知道这location被认为是您所在窗口的“属性”,我认为这是有道理的。但是即使这样,我也看不到指定全局对象的任何理由。location首先,除非没有重定向页面,否则就无法覆盖。

那么,这仅仅是已经使用了很长时间的怪癖,它已经与我们编写JavaScript的方式融为一体,还是有明显的理由要这样做呢?我检查了Google,可惜我什么都没想到...

Answers:


85

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

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

对我来说,明确编码的目的非常重要,因为它有助于我避免编写错误,然后在我发现错误时就可以找到它们。


我还可以想象,告诉JS在哪里可以找到变量,而不是让它在范围链上循环到全局范围,可以是一种更快的方法。
Rayjax 2015年

3
@Rayjax不,实际上,因为JS还必须遍历作用域链才能确定是什么window
lonesomeday

16

部分出于安全考虑,以防有人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
    })();

})();

11

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

window在浏览器中,它的作用有两个:一是充当(指定明确的)ECMAScript全局对象,二是充当提供有关浏览器环境信息的宿主对象。对于window以其宿主对象身份使用,我更喜欢明确并提供window.前缀:location没有它就可以工作的事实只是来自window精神分裂症性质的巧合。同样,如其他答案所指出的那样,如果location当前上下文中存在另一个变量,这也具有保护您的优势。

一个很好的理由不前缀DateMathwindow.是,这样做会创建代码无法在非浏览器环境下正常工作。其他环境通常不提供window全局对象的别名。


6

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

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


我就是这么想的,但是有很多人这样做。我看到的每个来源几乎都在使用window.location。唯一“与”网页我能找到讨论window.locationVS location.href,这都于事无补。
里德

5

这并不总是一个风格问题-我试图通过在窗口的load事件之后异步加载社交媒体按钮,方法是将脚本元素附加到片段中,然后将该片段附加到文档中。Twitter的widgets.jslocation.href在多个地方使用,并在IE 8/9中引起以下错误:对方法或属性访问的意外调用。我还没有弄清楚为什么,但是这只会在通过另一个页面的链接访问该页面时发生。如果只是将script元素附加到head或use上window.location.href,则不会发生这种情况,因此对于IE 8/9和IE似乎有些怪异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>

3

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

我认为使用location有点含糊,window.location为清楚起见使用。


1
我投票给了这个答案(几乎没有其他答案),因为,想象这个愚蠢的例子:function f() { var location = "home"; /* later on */ location = "http://google.com" } cry

@ user166390通过这种逻辑,您应该window.document每次都编写。我怀疑有人这样做。
superlukas 2015年

2

这只是样式问题。

从概念上讲,location是的属性window(窗口位于某个位置),与Math或不同Date


1

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.