window.location与只是位置

在整个networking中,我看到大量的JavaScript程序员编写window.location而不是location 。 我很好奇,如果有人能够提供一个解释,为什么。 window是全局对象,因此没有必要包含 – 不是吗? 我的意思是,你没有看到人写new window.Date()new window.Date() ,所以我很好奇,为什么它将与location指定。

我明白, location被认为是你所在的窗户的“财产”,我认为这是有道理的。 但即便如此,我也没有看到任何理由来指定全局对象。 首先不可能覆盖location ,而不是不redirect页面。

那么,这只是一个已经被使用了很长时间的怪癖,它已经和我们写JavaScript的方法结合起来了,还是有一些这样做的有形的理由? 我检查了谷歌,但唉,我什么都没有想出来…

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

  1. 尽可能避免全局variables是个好习惯。 使用window. 前缀提醒我,variables是全球性的,其他人不是。
  2. Javascript范围的本质允许你覆盖在范围树上更高的variables。 这意味着你可以在一个包含范围的某个地方设置var location (这不是一个不太可能用作variables名的单词),而是你正在做的。

对于我来说,编码的目的明确是非常重要的,因为它可以帮助我避免编写错误,并帮助我find它们。

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

编码的一部分是清晰的。 与math或date不同,位置在概念上是窗口的一个属性,所以代码变得更加清晰。 窗户。” 前缀应理想地被删除为了缩小。

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

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

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

没有为DateMath添加window.前缀的一个很好的理由window. 是否这样做会创build在非浏览器环境下不起作用的代码。 其他环境通常不提供window作为全局对象的别名。

它并不总是只是一个风格的问题 – 我试图加载社交媒体buttonasynchronous后窗口的加载事件通过将脚本元素附加到一个片段,然后将该片段附加到文档。 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> 

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

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

位置是窗口对象的一个​​属性,所以你可以通过请求window.location来得到它。 但是,如果你不指定一个对象,JavaScript会假定你需要这个窗口对象。 所以请求位置和请求window.location是一样的。

这只是一个风格问题。

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

他们实际上是相同的。 从技术上讲, “ window ”对象与Javascriptvariables的根作用域是一样的。