Javascript window.location与just location

Javascript window.location与just location,javascript,location,window.location,Javascript,Location,Window.location,在网络上,我看到大量JavaScript程序员编写window.location,而不仅仅是location。我很好奇是否有人能解释一下原因window是全局对象,因此不需要包含它,不是吗?我的意思是,你看不到有人写window.Math.floor或new window.Date(),所以我很好奇为什么它会被指定为location 我知道位置被认为是您所在窗口的“属性”,我认为这是有道理的。但即使如此,我也不认为有任何理由指定全局对象;首先,如果不重定向页面,就不可能覆盖位置 那么,这仅仅是一

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

我知道
位置
被认为是您所在窗口的“属性”,我认为这是有道理的。但即使如此,我也不认为有任何理由指定全局对象;首先,如果不重定向页面,就不可能覆盖
位置


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

这只是风格的问题


从概念上讲,
位置
窗口
(窗口位于某个位置)的属性,与
数学
日期
不同,它们实际上是相同的。从技术上讲,对象与Javascript变量的根作用域是一样的。

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


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

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

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


我认为使用
location
有点含糊不清,使用
window.location
更清楚一些。

部分是为了安全,以防有人在范围链的某个地方定义了
location
变量。
window.location
明确引用了
window
的属性

示例:


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

  • 尽可能避免使用全局变量是一个好习惯。使用
    窗口。
    前缀提醒我变量是全局变量,其他变量不是
  • Javascript作用域的性质允许您覆盖作用域树上较高位置的变量。这意味着您可以在包含范围内的某个地方设置
    var location
    (这不是一个不太可能用作变量名的词),然后您就可以开始工作了

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

    window.location和本机
    Math
    Date
    对象之间有很大区别,也就是说,
    Math
    Date
    是本地JavaScript对象,它们被指定为全局对象的属性,而
    window.location
    window
    宿主对象的属性(宿主对象是由环境提供的表示环境某些方面的对象,不受与本机JavaScript对象相同的规则约束。其他宿主对象包括
    文档
    和任何DOM元素)

    浏览器中的
    窗口
    有两个用途:第一,充当ECMAScript全局对象,第二,充当主机对象,提供有关浏览器环境的信息。对于在主机对象容量中使用
    窗口
    ,我更喜欢显式地提供
    窗口。
    前缀:
    位置
    在没有它的情况下工作,这只是来自
    窗口的巧合
    的精神分裂症性质。此外,正如其他答案所指出的,当当前上下文中存在另一个
    位置
    变量时,这也有保护您的优势


    不使用
    窗口作为
    日期
    数学
    前缀的一个很好的原因是,这样做会创建在非浏览器环境中无法工作的代码。其他环境通常不提供
    窗口
    作为全局对象的别名。

    这并不总是风格问题-我正在尝试加载在窗口加载事件后,通过将脚本元素附加到片段,然后将该片段附加到文档中,来异步使用社交媒体按钮。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>
    
    
    (功能(d,t){
    var head=document.getElementsByTagName('head')[0];
    var frag=d.createDocumentFragment();
    var s=d.createElement(t);
    s、 异步=真;
    s、 src='1〕http://platform.twitter.com/widgets.js';
    儿童碎片;
    头.附肢儿童(frag);
    }(文件“脚本”);
    
    我对这个答案投了赞成票(其他答案几乎都没有),因为,想象一下这个愚蠢的例子:
    函数f(){var location=“home”;/*稍后*/location=”http://google.com“}
    cry@user166390按照这个逻辑,你应该
    <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>