【问题标题】:Does IE create new scope for each script tag? [duplicate]IE 是否为每个脚本标签创建新范围? [复制]
【发布时间】:2013-08-12 21:23:32
【问题描述】:

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

【问题讨论】:

  • 可能是一个提升错误。我想var mylib = window.mylib || {}; 使您的第二个脚本按预期工作?
  • 其实不是,我以为会的。
  • 可能不是错误,而是规范中的差异。 IE8 是 ECMAScript 3 浏览器,而 IE9+、Chrome 等是 ES5 浏览器。不过,不能说 ES3 会导致什么。
  • @Martin,有一个很好的方法可以确定。如果在第二个 sn-p 中将 var mylib 重命名为 var _mylib,代码是否有效?如果是这种情况,看起来在全局范围内重新定义mylib(通过var)会覆盖现有的window.mylib
  • 难道var mylib 没有被提升到最顶端,而只是提升到脚本标签的顶端。这将导致mylib 在第二个标签中被重新定义为undefined。您可以尝试省略var,然后检查会发生什么。

标签: javascript cross-browser


【解决方案1】:

HTML &lt;script&gt; 标签 Javascript 在window 的范围内执行。因此,分离的脚本标签在同一范围内执行。

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

代替

var mylib = mylib || {};

使用

mylib = window.mylib || {};

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

【讨论】:

  • 如果它们在 IE 中位于同一范围内,那么 mylib 将与 window.mylib 相同吗?
【解决方案2】:

范围应该不是问题。每个&lt;script&gt; 都应该在同一个全局范围内进行评估。

但是,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>

【讨论】:

    【解决方案3】:

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

    &lt;script&gt;s 的范围仅限于窗口,因此只要正确定义和/或初始化变量或函数,您拥有多少以及在哪个变量或函数中访问它们都没有关系。

    【讨论】:

      猜你喜欢
      • 2019-05-07
      • 1970-01-01
      • 2017-04-26
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      相关资源
      最近更新 更多