window.location与只是位置

Rei*_*eid 69 javascript location window.location

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

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

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

lon*_*day 73

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

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

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

  • @Rayjax不,实际上,因为JS还必须遍历作用域链以确定`window`是什么. (3认同)

use*_*716 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
    })();

})();
Run Code Online (Sandbox Code Playgroud)


Tim*_*own 9

有一个很大的区别window.location,并原生MathDate对象,这是MathDate是被指定的存在为全局对象的属性本地JavaScript对象,而window.location为的性质window 主机对象(主机对象代表的一些方面的目的环境,由环境提供,不受与本机JavaScript对象相同的规则.其他主机对象包括document和任何DOM元素).

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

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


fuz*_*Tew 6

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

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


小智 5

这并不总是一个风格问题-我试图通过在窗口的load事件之后异步加载社交媒体按钮,方法是将脚本元素附加到片段中,然后将该片段附加到文档中。Twitter的widgets.js location.href在多个地方使用,并在IE 8/9中引起以下错误:对方法或属性访问的意外调用。我还没弄清楚原因,但这仅在通过另一个页面的链接访问该页面时发生。如果仅将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>
Run Code Online (Sandbox Code Playgroud)