window.location与只是位置
在整个networking中,我看到大量的JavaScript程序员编写window.location
而不是location
。 我很好奇,如果有人能够提供一个解释,为什么。 window
是全局对象,因此没有必要包含 – 不是吗? 我的意思是,你没有看到人写new window.Date()
或new window.Date()
,所以我很好奇,为什么它将与location
指定。
我明白, location
被认为是你所在的窗户的“财产”,我认为这是有道理的。 但即便如此,我也没有看到任何理由来指定全局对象。 首先不可能覆盖location
,而不是不redirect页面。
那么,这只是一个已经被使用了很长时间的怪癖,它已经和我们写JavaScript的方法结合起来了,还是有一些这样做的有形的理由? 我检查了谷歌,但唉,我什么都没有想出来…
我总是在我的代码中使用window.location
,主要有两个原因:
- 尽可能避免全局variables是个好习惯。 使用
window.
前缀提醒我,variables是全球性的,其他人不是。 - Javascript范围的本质允许你覆盖在范围树上更高的variables。 这意味着你可以在一个包含范围的某个地方设置
var location
(这不是一个不太可能用作variables名的单词),而是你正在做的。
对于我来说,编码的目的明确是非常重要的,因为它可以帮助我避免编写错误,并帮助我find它们。
部分为了安全,以防某人在范围链中某处定义了一个location
variables。 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
与原生的Math
和Date
对象之间有很大的区别, Math
和Date
是指定作为全局对象的属性存在的原生JavaScript对象,而window.location
是window
主机对象的属性 (一个主机对象是一个代表环境提供的环境某个方面的对象,不受原生JavaScript对象的规则约束,其他主机对象包括document
和任何DOM元素)。
浏览器中的window
有两个目的:首先,作为(明确指定的)ECMAScript全局对象;其次,充当提供浏览器环境信息的主机对象。 对于在其主机对象容量中使用window
,我更喜欢显式地提供window.
前缀:没有它的location
工作的事实只是巧合来自window
的精神分裂性质。 另外,正如其他答案所指出的那样,在当前上下文中存在另一个location
variables的情况下,这也具有保护您的优势。
没有为Date
或Math
添加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是一样的。
这只是一个风格问题。
从概念上讲, location
是window
的属性(窗口位于某个位置),与Math
或Date
不同。
他们实际上是相同的。 从技术上讲, “ window
”对象与Javascriptvariables的根作用域是一样的。