javascript - 为什么 IE 会破坏 window.ABC 变量?

标签 javascript internet-explorer scope browser-bugs

运行以下代码块时,FF 和 Chrome 输出 typeof(hiya) = string而IE7/8输出typeof(hiya) = undefined .

<html>
    <body>
        <script type="text/javascript">
            window.hiya = 'hiya';
        </script>
        <script type="text/javascript">
            if( false ) {
                var hiya = 1;
            }
            document.write( "typeof(hiya) = "+ typeof(hiya) );
        </script>
    </body>
</html>

以下各项均可使问题消失:

  • 将所有内容合并为一个<script>阻止。
  • 删除 if阻止。
  • 重命名 var hiya = 1var hiya2 = 1 .
  • 重命名 var hiya = 1window.hiya = 1 .
  • 重命名 var hiya = 1hiya = 1 .

发生了什么?IE 中是否存在范围界定错误?

最佳答案

IE 很愚蠢,它无法识别 window.varNamevar varName 在某些情况下访问同一变量。

当遇到新的脚本标签时,它首先初始化所有用var声明的变量。它不运行 var 语句(将其初始化为“hiya”的部分)。它只是将其初始化为未定义。如果它之前是用 var 声明的,它就不会这样做。

如果您的代码位于单个脚本标记中,则不会发生此错误。另外,如果 hiya 的第一个声明是用 var 完成的,那么这个错误也不会发生。

具体来说,在你的第二个脚本标签中,IE 首先查找 var 语句,它找到一个 var var hiya = 1;然后它说,hiya 之前没有用 var 语句初始化(IE 是愚蠢的,其他浏览器认识到 window.hiya 做了同样的事情)并初始化 hiya,在执行任何代码之前覆盖 window.hiya。

可能的解决方案:

  • 将代码保留在同一脚本标记内
  • 不要使用 window.hiYa 初始化变量
  • 如果您无法控制其中一个脚本,请确保使用 var 的脚本位于第一位

最后一点是澄清 JS 解析器对代码做了什么。当 JS 解析器看到您的代码时,会将其转换为以下内容:

<html>
    <body>
        <script type="text/javascript">
            window.hiya = 'hiya';
        </script>
        <script type="text/javascript">
            // IE is dumb, it doesn't recognize that hiya is already 
            // defined as window.hiya, so it's initialized to undefined here
            var hiya;
            if( false ) {
                hiya = 1;
            }
            document.write( "typeof(hiya) = "+ typeof(hiya) );
        </script>
    </body>
</html>

因此,如果您将所有内容放入一个脚本标记中,这就是代码(在 JS 引擎将 var 语句移至顶部之后),因此您可以看到 IE 不可能将其搞砸,因为您的 window.hiya 赋值将位于移至顶部的 var 之后。

<html>
    <body>
        <script type="text/javascript">
            var hiya;
            window.hiya = 'hiya';
            if( false ) {
                hiya = 1;
            }
            document.write( "typeof(hiya) = "+ typeof(hiya) );
        </script>
    </body>
</html>

关于javascript - 为什么 IE 会破坏 window.ABC 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4606847/

相关文章:

javascript - 元素的动画运动

javascript - 如何在 Jquery DataTables 中去除标签

javascript - IE JavaScript 重定向

java - 如何访问构造函数内创建的对象?

c++ - 为什么这个功能进入范围?

Javascript:属性描述符和内置属性属性之间的关系是什么

javascript - jquery $(this).attr ('id' ) 给出未定义的结果

javascript - 在 IE8 中无法从 JSONP 文件中正确读取特殊字符

CSS: IE "ignores"字体系列,正文除外

r - 应用系列功能的范围如何?