在JavaScript中缺少分号导致“'foo'未定义”错误在IE9中

时间:2011-03-22 20:15:55

标签: javascript internet-explorer-9

我花了大约四个小时来追踪这个问题。我知道是什么导致了它,但不知道为什么,“为什么”让我烦恼。

我有以下.js文件:

function funcA() {
}
function funcB() {
    do {
    } while (1 == 1) return 0
}

我还有以下HTML页面:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <title></title>
    <script src="JScript1.js" type="text/javascript"></script>
</head>
<body>
    <script type="text/javascript">
        new funcA();
    </script>
</body>
</html>

当我在IE9中加载页面时,我收到错误“'funcA'未定义。”我可以通过任何一个来解决运行时错误:

  • 启用IE9中的兼容性视图
  • 从页面中删除DOCTYPE
  • 在JavaScript之后和返回之前添加分号(即while(1 = 1); return 0)

任何人都可以帮我理解这里到底发生了什么吗?

2 个答案:

答案 0 :(得分:1)

不幸的是,JavaScript并不要求你在任何地方明确地放置分号 - 但它会在内部为你提供这些分号。这通常会导致难以追踪错误和意外行为。

您的代码中的其他语法错误(正如其他人指出的那样),; 中的while之后的do-while,当您放在那里,事情按照你的期望工作。如果没有这样做,那么临时开发人员几乎不可能预测不同环境的行为如何不深入研究语言规范和JS引擎理解它们 - 假设有JS引擎本身的实现没有错误。 Little things such as whether you have braces ( { and } ) in the same line or not can make a difference

答案 1 :(得分:0)

从我对ECMAScript spec的阅读中,IE的行为正确。参见章节:

  • 7.9.1自动分号插入规则(描述自动分号) 可能是分号的情况 插入,均不适用)

  • 12.6.1执行声明(表明您的代码不是do Statement while ( Expression );

  • 形式的有效作品