我在一些遗留代码中注意到以下模式:
<script>
<!--
// code
// -->
</script>
经过一些研究,这似乎是一种非常旧技术,用于在浏览器不支持<script>
元素时从DOM中隐藏脚本元素的内容。可以找到更多信息here。
我担心的是:为什么<!--
不会抛出语法错误?我在whatwg.org's website上发现<!--
应该在功能上等同于{ {1}},它链接到ECMAScript grammar about comments的代码段。问题是,//
根本没有被语法定义。
所以这似乎是所有主流浏览器都会实现的未定义行为。是否有允许这样做的规范,或者这是人们提出的向后兼容性攻击?
答案 0 :(得分:5)
正式:因为HTML规范中有specific handling for it。例如,它是一个&#34; by fait&#34;事情。它不是JavaScript的东西,你在JavaScript语法中找不到它。
非正式地说,看起来至少有一些JavaScript引擎本质上处理它,有时会使我认为有效的JavaScript无效。例如,在浏览器中的V8上,这会失败:
eval("var a = 1; var n = 3; console.log(a<!--n);")
&#13;
...与Unexpected end of input
。我很确定不应该,但我不是解析律师。我希望它将false
记录到控制台,如下所示:
eval("var a = 1; var n = 3; console.log(a<! --n);")
// Note the space -------------------------^
&#13;
旁注:Meteor的jsparser同意我的意见,将双引号内的位复制并粘贴到其中。
请注意,字符<!
不会出现在the specification中,也不会出现任何近70个单词中出现的任何内容&#34; comment&#34;在那里,它也不在comment grammar的任何地方,所以它似乎不是一个明确的符合规范的例外。它至少是一些JavaScript引擎所做的事情,以避免人们做愚蠢的事情搞砸了。没什么好吃的。 : - )
答案 1 :(得分:1)