如果JavaScript忽略换行符,它如何解析单行注释



在编写JavaScript bookmarklet时,不能使用//,因为JavaScript代码被视为一行。您必须使用/* ... */。这对我来说没有意义,因为即使换行符被忽略,您也可以在普通脚本中使用//

在最终指南的第2.3节中

JavaScript忽略出现在程序中的令牌。。。

然后,在最终指南的第2.5节

。。。//和行尾之间的任何文本都被视为注释并且被JavaScript忽略。。。

这些说法似乎自相矛盾。

根据第2.3节,由于换行符被忽略,因此正常脚本几乎也是J.S的一行。有人能向我解释一下为什么//在普通脚本中是可能的,而在bookmarklet中是不可能的吗?

让我强调第一句话的一部分

JavaScript忽略程序中标记之间出现的空格、制表符和换行符

程序被划分为令牌。例如,以下程序

var x = "abc123";

具有5个令牌,即varx="abc123";。如果你在代币之间放更多的空间,

var    x     =    "abc123"       ;

没关系。但是如果你在一个令牌里面放一个空格,那么它就可以改变程序。例如,

va r x = " a b c 12 3";

不编译。

这就是为什么这两种说法并不矛盾的原因。注释是被忽略的单个标记。如果在注释的中间放一个换行符,那么就不是在程序中的记号之间放空格,而是在记号的中间放空格。

//注释会忽略行中的其余内容。由于bookmarklet只包含一行,所以您将注释掉//之后的所有内容。在一个普通的脚本中,你可以有很多行,所以你不会有同样的问题。

如果您想知道这是如何指定的,下面是ECMAScript 5规范中语法的相关部分:

SingleLineComment ::
// SingleLineCommentCharsopt
SingleLineCommentChars ::
SingleLineCommentChar SingleLineCommentCharsopt
SingleLineCommentChar ::
SourceCharacter but not LineTerminator

因为bookmarklet是单行脚本,其中作为常规脚本可以是多行。

第2.3节有点含糊。在某些情况下,空白确实很重要,但//只是"告诉"处理器忽略该行的其余部分。

如果你在bookmarklet中使用//,它就会立即停止处理。

最新更新