Javascript IE是否为每个脚本标记创建新范围?

Javascript IE是否为每个脚本标记创建新范围?,javascript,cross-browser,Javascript,Cross Browser,为什么下面的html文件在IE中默认显示标题?其他浏览器将标题显示为mytitle <script> window.mylib = window.mylib || {}; mylib.title = 'mytitle'; </script> <script> var mylib = mylib || {}; document.title = mylib.title || 'default'; </script> window.mylib=wi

为什么下面的html文件在IE中默认显示标题?其他浏览器将标题显示为mytitle

<script>
window.mylib = window.mylib || {};
mylib.title = 'mytitle';
</script>

<script>
var mylib = mylib || {};
document.title = mylib.title || 'default';
</script>

window.mylib=window.mylib | |{};
mylib.title='mytitle';
var mylib=mylib | |{};
document.title=mylib.title | |“默认值”;
IE是否为每个脚本标记创建单独的作用域

这只是一个bug还是行为不同

(在IE8和最新的chrome/ff/opera中测试)

标记Javascript在
窗口的范围内执行。因此,在同一范围内执行分离的脚本标记

特别是在IE7中,尝试不要在第二次重新定义变量:

而不是

var mylib = mylib || {};
使用


当遇到
var mylib
时,IE7可能会覆盖
mylib
的定义。

您正在初始化
窗口。mylib
在第一个
标记中。在第二个
标记中,您正在使用
mylib
窗口初始化
var mylib
。然后对照此项检查
title
的值。如果我能正确理解,似乎有一些逻辑问题


的作用域为窗口,因此只要变量或函数定义和/或初始化正确,访问变量或函数的数量和位置都无关紧要。

作用域不应成为问题。每个
都应在相同的全局范围内进行评估

然而,
window.mylib=…
在IE8中似乎并不被视为实际的声明。因此,在它后面加上
var mylib
会导致覆盖/重置为
undefined

<script>
  window.mylib = {};
</script>

<script>
  console.log(typeof window.mylib); // object
</script>

<script>
  var mylib;
  console.log(typeof window.mylib); // undefined
</script>

可能是起重故障。我想象
var mylib=window.mylib | |{}使您的第二个脚本按预期工作?事实上不是,但我认为它会。可能不是一个bug,而是规范中的一个差异。IE8是ECMAScript 3浏览器,而IE9+、Chrome等是ES5浏览器。“不过,我不知道ES3的什么原因会导致这种情况。”马丁,有一个好办法可以确定。如果在第二个代码段中将
var mylib
重命名为
var\u mylib
,代码是否有效?如果是这样的话,看起来在全局范围内重新定义
mylib
(通过
var
)会覆盖现有的
窗口。mylib
。难道
var mylib
不会被提升到最顶端,而只是提升到脚本标记的顶端吗。这将导致在第二个标记中将
mylib
重新定义为
undefined
。您可以尝试省略
var
并检查接下来会发生什么。如果它们在IE中位于同一范围内,则mylib将与window相同。mylib否?
<script>
  window.mylib = {};
</script>

<script>
  console.log(typeof window.mylib); // object
</script>

<script>
  var mylib;
  console.log(typeof window.mylib); // undefined
</script>
<script>
  var mylib = mylib || {};
  mylib.title = 'mytitle';
</script>

<script>
  var mylib = mylib || {};
  document.title = mylib.title || 'default'; // 'mytitle'
</script>