JavaScript和ECMAScript中的单行"<! - "注释

Bas*_*ass 7 javascript ecma262

在上个世纪,有一个流行的"黑客"隐藏JavaScript从非启用JavaScript的浏览器:

<script type = "text/javascript">
    <!--
    alert("Hello, World!");
    // --> Your browser doesn't support JavaScript
</script>
Run Code Online (Sandbox Code Playgroud)

尽管<!--在许多教程中解释为仅仅是单行JavaScript注释,但在ECMAScript标准中没有提及它(参见7.4注释).虽然是非标准的,但所有现代浏览器都支持这种类型的注释,因此您可以用它注释掉任何JavaScript代码:

<script type = "text/javascript">
    <!-- alert("Hello, World!");
    <!-- This is a comment
    <!-- This is another comment
    <!-- This is yet another comment
</script>
Run Code Online (Sandbox Code Playgroud)

但是,有一个例外:eval()功能.以下代码在Communicator 4.x/Mozilla/Opera(Presto)/ Safari/Chrome中正常工作,但在MSIE中导致语法错误:

<form action = "#">
    <script type = "text/javascript">
        function testEval() {
            var s = "<!--\n";
            s += "alert(\"eval() invoked\");\n";
            s += "// -->"
            eval(s);
        }
    </script>
    <input type = "button" value = "Test eval()" onclick = "testEval();"/>
</form>
Run Code Online (Sandbox Code Playgroud)

基本上,与所有其他浏览器不同,MSIE失败了eval("<!--").

2个问题:

  • <!--在JavaScript中的状态是什么?它是否在任何(甚至过时的)JavaScript规范/文档中定义?或者现代浏览器是否保留了某种bug-by-bug兼容性?编辑:这已经得到了解答.
  • 你知道为什么MSIE/Trident会有所不同吗?特别是,这个自定义行为(eval()函数)是否应该被报告为Microsoft的错误?