评论在所有主要环境中都是 100% 安全的吗?
Posted
技术标签:
【中文标题】评论在所有主要环境中都是 100% 安全的吗?【英文标题】:Are comments 100% safe on all the major environments? 【发布时间】:2012-09-21 11:03:30 【问题描述】:cmets 是在解析之前从源代码中直接剥离出来的,还是可以算作换行符并在某些上下文中破坏连续性?
'foo'.replace(/f/, 'b') //f->b
.replace(/o/, 'a') //o->a
.replace(/o/, 'r') /*o->r*/ ;
'foo'.replace(/x/, /*matches "x"*/ 'y');
var foo = ( true !== false ) ? // bikeshed
'bar' : /*if they're equal, which they won't be, we'll want 'baz'*/ 'baz';
你知道,因为他们说空格是“安全的”和“微不足道的”或其他什么,但我们都知道有例外。 cmets 真的安全吗?
【问题讨论】:
我猜是这样,除非您使用的编译器/解析器中存在解析错误.. 史诗般的问题,这意味着它以前被问过。有吗? 无论 SO Markdown 语法高亮器在做什么,都会发生什么 @qwertymk WTF 你是基于这个吗? 另见this thread 【参考方案1】:它们在解析期间被忽略,如果它们在解析之前被剥离,解析器将需要扫描输入两次。
但是,不考虑行尾的 LineTerminator 成为单行注释的一部分;它被单独识别 词汇语法并成为输入元素流的一部分 为句法文法。这一点非常重要,因为它 意味着单行 cmets 的存在与否不 影响自动分号插入的过程
ES5 Specification for comments.
源代码被标记化,就好像 cmets 不存在一样。
【讨论】:
abc/* A comment */def
是一个标识符 (abcdef
) 还是两个(abc
后跟 def
)?
好问题,@j_random_hacker
@alex,他不关心规范,显然他只对浏览器的实现感兴趣。
@adlwalrus 是的,\n
是为了 ASI 的规则而保留的。
@adlwalrus:谢谢,不过如果 javascript 与 C++ 类似,那么依靠解释器/编译器来“正确处理”是自找麻烦 :) 在 C++ 中,规则是 cmets 变成单个空格.类似的极端案例是x+/* Comment */+;
。【参考方案2】:
是的,cmets 是安全的。
(话虽如此,我已经看到一些损坏的服务器端 html 压缩器,它们不知道内联 JavaScript 是什么,并删除了所有换行符。以 //
开头的注释将整个脚本删除。 )
【讨论】:
如果你能引用任何来源,我会在 10 分钟内接受这个。 @adlwalrus,我的消息来源是,15 年来,我还没有看到浏览器搞砸了 JavaScript cmets。如果你不想相信它,那很好。无论如何,亚历克斯的答案是一个更好的答案,有他的解释。 @adlwalrus,如果你想要规格:ecma-international.org/ecma-262/5.1/#sec-7.4 在我的书中这是一个非常好的来源,我 100% 愿意相信它。我只是想知道你的依据是什么。 对我如此谦虚以至于建议我接受其他人表示赞同。我想在 29.3k 代表时,积分短缺早已不再是挫折的根源,而且琐碎消失了? :P 另外,为规范链接升级。以上是关于评论在所有主要环境中都是 100% 安全的吗?的主要内容,如果未能解决你的问题,请参考以下文章