ray*_*min 9 javascript syntax standards grammar
我在一些遗留代码中注意到以下模式:
<script>
<!--
// code
// -->
</script>
Run Code Online (Sandbox Code Playgroud)
经过一些研究,这似乎是一种非常古老的技术,用于在浏览器不支持该<script>元素时从DOM中隐藏脚本元素的内容.更多信息可以在这里找到.
我担心的是:为什么不<!--抛出语法错误?我在whatwg.org的网站上发现了它<!--应该在功能上等同于//它,并且它链接到ECMAScript语法中关于注释的片段.问题是,<!--该语法根本没有定义.
所以这似乎是所有主流浏览器都会实现的未定义行为.是否有允许这样的规范,或者这是一个人们提出的向后兼容性黑客攻击?
正式:因为HTML规范中有特定的处理方式.例如,这是一个"通过既成事实"的事情.它不是JavaScript的东西,你不会在JavaScript语法中找到它.
非正式地,似乎至少有一些JavaScript引擎本质上处理它,有时候会使我认为有效的JavaScript无效.例如,在浏览器中的V8上,这会失败:
eval("var a = 1; var n = 3; console.log(a<!--n);")Run Code Online (Sandbox Code Playgroud)
......用Unexpected end of input.我很确定它不应该,但我不是解析律师.我希望它能够登录false到控制台,就像这样:
eval("var a = 1; var n = 3; console.log(a<! --n);")
// Note the space -------------------------^Run Code Online (Sandbox Code Playgroud)
旁注:Meteor的jsparser同意我的说法,将双引号内的位复制并粘贴到其中.
请注意,这些字符<!不会出现在规范中,也不会出现任何近70个单词"comment"中出现的内容,也不会出现在注释语法中的任何位置,所以它似乎不是一个明确的符合规范的例外.这只是至少一些JavaScript引擎所做的事情,以避免人们做愚蠢的事情搞砸了.没什么好吃的.:-)