Javascript window.location与just location
在网络上,我看到大量JavaScript程序员编写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 我知道位置被认为是您所在窗口的“属性”,我认为这是有道理的。但即使如此,我也不认为有任何理由指定全局对象;首先,如果不重定向页面,就不可能覆盖位置 那么,这仅仅是一
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
,主要原因有两个:
窗口。
前缀提醒我变量是全局变量,其他变量不是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>