IE是否为每个脚本标记创建新的作用域

Does IE create new scope for each script tag?

本文关键字:创建 作用域 脚本 是否 IE      更新时间:2023-09-26

为什么下面的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中测试)

HTML <script>标记Javascript在window的作用域中执行。因此,在相同的作用域上执行分离的脚本标记。

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

代替

var mylib = mylib || {};

使用

mylib = window.mylib || {};

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

作用域不应该是个问题。每个<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>

您正在初始化第一个<script>标记中的window.mylib。在第二个<script>标记中,使用mylib而不是window.mylib初始化var mylib。然后将title的值与此进行核对。如果我能正确理解的话,似乎会有一些逻辑问题。

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