为什么<! - 不会抛出语法错误?

ray*_*min 9 javascript syntax standards grammar

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

<script>
    <!--
    // code
    // -->
</script>
Run Code Online (Sandbox Code Playgroud)

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

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

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

T.J*_*der 5

正式:因为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引擎所做的事情,以避免人们做愚蠢的事情搞砸了.没什么好吃的.:-)

  • @NiettheDarkAbsol var x =({a:function(c){this.b.push(c); return c?this.a( - c):this.b;},b:[]}.a(〜 + "" + >>>! ""))!; 有了JS,我总是先想着"这显然是无效的语法". (2认同)