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在我的代码中使用两个主要原因:
window.前缀提醒我变量是全局变量而其他变量不是全局变量.var location在包含范围内设置某个位置(这不是一个不太可能被用作变量名称的单词),而是您正在研究它.对我来说,编码时目的明确非常重要,因为它可以帮助我避免编写错误,然后帮助我找到它们.
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)
有一个很大的区别window.location,并原生Math和Date对象,这是Math和Date是被指定的存在为全局对象的属性本地JavaScript对象,而window.location为的性质window 主机对象(主机对象代表的一些方面的目的环境,由环境提供,不受与本机JavaScript对象相同的规则.其他主机对象包括document和任何DOM元素).
window在浏览器中有两个目的:第一,充当(明确指定的)ECMAScript全局对象,第二,充当提供有关浏览器环境的信息的主机对象.对于window在其宿主对象容量中的使用,我更喜欢明确并提供window.前缀:location没有它的事实只是来自window精神分裂症性质的巧合.此外,正如其他答案所指出的location,在当前上下文中存在另一个变量的情况下,这也具有保护您的优点.
不加前缀Date或Math使用前缀的一个好理由window.是这样做会创建在非浏览器环境中不起作用的代码.其他环境通常不提供window全局对象的别名.
编码的一部分是清晰度.与数学或日期不同,位置在概念上是窗口的属性,因此代码变得更加清晰以包含它.窗户." 理想情况下,应删除前缀以进行缩小.
你可能是正确的,很多原因都是历史性的.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)