为什么<! - 不会引发语法错误? - >

时间:2014-10-15 21:13:08

标签: javascript syntax standards grammar

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

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

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

我担心的是:为什么<!--不会抛出语法错误?我在whatwg.org's website上发现<!--应该在功能上等同于{ {1}},它链接到ECMAScript grammar about comments的代码段。问题是,//根本没有被语法定义。

所以这似乎是所有主流浏览器都会实现的未定义行为。是否有允许这样做的规范,或者这是人们提出的向后兼容性攻击?

2 个答案:

答案 0 :(得分:5)

正式:因为HTML规范中有specific handling for it。例如,它是一个&#34; by fait&#34;事情。它不是JavaScript的东西,你在JavaScript语法中找不到它。

非正式地说,看起来至少有一些JavaScript引擎本质上处理它,有时会使我认为有效的JavaScript无效。例如,在浏览器中的V8上,这会失败:

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

...与Unexpected end of input。我很确定不应该,但我不是解析律师。我希望它将false记录到控制台,如下所示:

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

旁注:Meteor的jsparser同意我的意见,将双引号内的位复制并粘贴到其中。

请注意,字符<!不会出现在the specification中,也不会出现任何近70个单词中出现的任何内容&#34; comment&#34;在那里,它也不在comment grammar的任何地方,所以它似乎不是一个明确的符合规范的例外。它至少是一些JavaScript引擎所做的事情,以避免人们做愚蠢的事情搞砸了。没什么好吃的。 : - )

答案 1 :(得分:1)

W3's docs为用户代理定义:

  

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

所以浏览器遵循这些标准