为什么<!——不引发语法错误
Why does <!-- Not Throw a Syntax Error?
我在一些遗留代码中注意到以下模式:
<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元素的开头,并忽略其他字符,直到该行结束。
因此浏览器遵循这些标准
- 铬:“;未捕获的语法错误:意外的标记:"
- Javascript未捕获语法错误意外的标识符错误
- 为什么忽略了eval()代码中的语法错误
- 难以访问的JS环境中的语法错误
- 未捕获的语法错误:意外的标记{
- "未捕获的语法错误:意外的标记}"
- 未捕获的语法错误:无法在“文档”上执行“查询选择器”
- React JS:未捕获(在承诺中)语法错误:在位置 0 的 JSON 中意外<令牌
- $(input[]).仅在firefox中出现每个抛出语法错误
- 为什么浏览器没有为语法错误抛出异常
- 错误:语法错误,无法识别的表达式:不支持的伪:无效/RectJS/Unit Testing
- 未捕获的语法错误:意外的令牌,
- jQuery.getJSON失败,语法错误
- "未捕获的语法错误:意外的标记"角度JS
- 参数列表Three.js之后的未捕获语法错误:缺少)
- 循环的Javascript冻结浏览器,没有语法错误
- 为什么匿名函数本身就是javascript中的语法错误
- 这怎么不是语法错误?这毫无意义!(javascript)
- 语法错误:缺少:在属性 ID 之后
- 未捕获错误:语法错误,无法识别的表达式:input[@type=submit]