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

时间:2013-08-12 12:42:35

标签: 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>

IE是否为每个脚本标记创建了单独的范围?

这只是一个错误或为什么行为不同?

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

3 个答案:

答案 0 :(得分:3)

HTML <script>标记Javascript在window范围内执行。因此,分离的脚本标记在同一范围内执行。

特别是对于IE7,请不要在第二次重新定义变量:

而不是

var mylib = mylib || {};

使用

mylib = window.mylib || {};

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

答案 1 :(得分:3)

范围不应成为问题。应在同一全局范围内评估每个<script>

但是,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 mylibwindow.mylib时,它应该按预期工作。似乎它只是问题的混合物。

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

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

答案 2 :(得分:0)

您正在第一个window.mylib标记中初始化<script>。在第二个<script>标记中,您使用var mylib而不是mylib初始化window.mylib。然后针对此检查title的值。如果我能够正确理解它,似乎存在一些逻辑问题。

<script>的范围限定在窗口中,因此只要它们被正确定义和/或初始化,您访问变量或函数的数量和数量并不重要。