为什么<!——不引发语法错误

Why does <!-- Not Throw a Syntax Error?

本文关键字:语法 错误 为什么 lt      更新时间:2023-09-26

我在一些遗留代码中注意到以下模式:

<script>
    <!--
    // code
    // -->
</script>

经过一些研究,这似乎是一种非常古老的技术,用于在浏览器不支持<script>元素时从DOM中隐藏脚本元素的内容。更多信息可以在这里找到。

我关心的是:为什么<!--不抛出语法错误我在whatwg.org的网站上发现,<!--在功能上应该等同于//,它链接到ECMAScript语法中关于注释的片段。问题是,<!--根本不是由那个语法定义的。

因此,这似乎是所有主流浏览器都会实现的未定义行为。有没有一个规范允许这样做,或者这是人们提出的向后兼容性破解?

官方:因为HTML规范中对它有特定的处理。例如,它是一个"按事实"的东西。这不是JavaScript的东西,你不会在JavaScript语法中找到它。

非官方地,似乎至少有一些JavaScript引擎从本质上处理它,有时会使我认为有效的JavaScript无效。例如,在浏览器中的V8上,此操作失败:

eval("var a = 1; var n = 3; console.log(a<!--n);")

用CCD_ 6。我很确定它不应该,但我不是解析律师。我希望它将false记录到控制台,就像这样:

eval("var a = 1; var n = 3; console.log(a<! --n);")
// Note the space -------------------------^

附带说明:Meteor的jsparser同意我的观点,只复制并粘贴双引号内的部分。

请注意,字符<!没有出现在规范中,在其中出现的70个单词"comment"中也没有任何内容,也没有出现在注释语法中的任何位置,因此它似乎不是规范中的明确异常。这只是至少一些JavaScript引擎所做的事情,以避免人们做愚蠢的事情。毫不奇怪。:-)

它是由W3的文档为用户代理定义的:

JavaScript引擎允许字符串"<!--"出现在SCRIPT元素的开头,并忽略其他字符,直到该行结束。

因此浏览器遵循这些标准