在网络上,我看到大量的JavaScript程序员正在编写window.location
而不是location
。我很好奇是否有人可以提供解释原因。 window
是全局对象,因此没有必要包括 - 不是吗?我的意思是,你没有看到人们写window.Math.floor
或new window.Date()
,所以我很好奇为什么会用location
来指定。
我知道location
被认为是你所在窗口的“属性”,我认为这是有道理的。但即便如此,我也没有理由指定全局对象;首先不可能覆盖location
,而不是重定向页面。
那么,这只是一个长期使用的怪癖,它与我们编写JavaScript的方式相结合,还是有一些切实的理由以这种方式做事?我查了谷歌,但是唉,我什么都没想出来......
答案 0 :(得分:66)
我总是在代码中使用window.location
有两个主要原因:
window.
前缀提醒我变量是全局变量而其他变量不是。var location
(这不是一个不太可能被用作变量名称的词),而是您正在研究它。对我而言,编码时目的明确非常重要,因为它可以帮助我避免编写错误,然后帮助我找到它们。
答案 1 :(得分: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
})();
})();
答案 2 :(得分:9)
window.location
与原生Math
和Date
对象之间存在很大差异,Math
和Date
是指定的本机JavaScript对象作为全局对象的属性存在,而window.location
是window
主机对象的属性(主机对象是表示环境某些方面的对象,由环境,并且不受与本机JavaScript对象相同的规则的限制。其他主机对象包括document
和任何DOM元素。
window
有两个目的:第一,充当(明确指定的)ECMAScript全局对象;第二,充当提供有关浏览器环境信息的主机对象。对于window
在其主机对象容量中的使用,我更喜欢明确并提供window.
前缀:location
在没有它的情况下工作的事实只是来自{{1}的巧合精神分裂的本性。此外,正如其他答案所指出的,在当前上下文中存在另一个window
变量的情况下,这也有保护您的优势。
不为location
或Date
添加Math
前缀的一个好理由是,这样做会创建在非浏览器环境中无效的代码。其他环境通常不提供window.
作为全局对象的别名。
答案 3 :(得分:6)
编码的一部分是清晰度。与数学或日期不同,位置在概念上是窗口的属性,因此代码变得更加清晰以包含它。窗户。”理想情况下,前缀应该被移除以进行缩小。
你可能是正确的,很多原因都是历史性的。 Javascript具有复制和粘贴的广泛历史。
答案 4 :(得分:5)
这并不总是风格问题 - 我试图在窗口加载事件后异步加载社交媒体按钮,方法是将脚本元素附加到片段,然后将该片段附加到文档中。 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>
答案 5 :(得分:3)
window
对象是默认的工作命名空间,因此location
将等于window.location
。
我认为使用location
有点含糊不清,为了清晰起见,请使用window.location
。
答案 6 :(得分:2)
这只是风格问题。
从概念上讲,location
是window
的属性(窗口位于某个位置),与Math
或Date
不同。
答案 7 :(得分:1)
location是window对象的属性,因此您可以通过请求window.location来获取它。但是,如果您没有指定对象,则JavaScript假定您需要窗口对象。因此,请求位置与请求window.location相同。
答案 8 :(得分:0)
它们实际上是相同的。从技术上讲,"window
"对象与Javascript变量的根作用域相同。