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

时间:2013-12-22 22:58:29

标签: javascript bookmarklet javascriptcore

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

The Definitive Guide

第2.3节
  

JavaScript会忽略显示在其间的空格,制表符和换行符   程序中的令牌......

然后,在“权威指南”的第2.5节

  

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

这些陈述似乎是矛盾的。

根据第2.3节,正常脚本几乎是J.S的一行,因为新行被忽略。有人可以向我解释为什么//在普通脚本中是可能的,而不是在书签中?

2 个答案:

答案 0 :(得分:4)

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

  

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

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

var x = "abc123";

有5个令牌,即varx="abc123";。如果在令牌之间放置更多空格,

var    x     =    "abc123"       ;

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

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

无法编译。

这种差异就是为什么这两个陈述并不矛盾。注释是一个被忽略的标记。如果你在评论的中间添加换行符,那么你不会在程序中的标记之间放置空格,而是在标记的中间放置一个空格。

//评论会忽略该行的其他内容。由于bookmarklet只包含1行,因此您将在//之后注释掉所有内容。在普通脚本中,您可以拥有多行,因此您不会遇到同样的问题。

如果你很好奇这是如何指定的,这里是relevant part of the grammar in the ECMAScript 5 specification

SingleLineComment ::
   // SingleLineCommentCharsopt

SingleLineCommentChars ::
   SingleLineCommentChar SingleLineCommentCharsopt

SingleLineCommentChar ::
    SourceCharacter but not LineTerminator

答案 1 :(得分:2)

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

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

如果您在书签中使用//,那么它就会停止处理。