【问题标题】:How does JavaScript parse single line comments if it ignores newlines?如果 JavaScript 忽略换行符,它如何解析单行注释?
【发布时间】:2013-12-22 22:58:29
【问题描述】:

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

The Definitive Guide第2.3节

JavaScript 会忽略中间出现的空格、制表符和换行符 程序中的令牌...

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

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

这些陈述似乎相互矛盾。

根据第 2.3 节,正常的脚本几乎也是单行 J.S,因为换行符被忽略了。有人可以向我解释为什么// 可以在普通脚本中使用,但不能在书签中使用吗?

【问题讨论】:

  • 您似乎忽略了最重要的部分,即出现在标记之间的 "..."
  • 您可以粘贴 boomarklets here 以对它们进行 url 编码(和取消编码)。
  • “JavaScript 忽略空格、制表符和换行符”的说法是错误的。它们根本不会被忽略,它们对于分隔标记、自动分号插入和结束具有以下脚本的单行 cmets 是必不可少的。见ECMA-262 §7.2White space characters are used to improve source text readability and to separate tokens (indivisible lexical units) from each other, but are otherwise insignificant。此外,Line terminators 不是空格。
  • @Phil 我不认为我是。如果你取 var a = 5; var b = 6;换行符出现在标记之间,但不会被忽略。我可能误解了他对“被忽略”的定义。

标签: javascript bookmarklet javascriptcore


【解决方案1】:

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

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

程序分为令牌。比如下面这个程序

var x = "abc123";

有5个token,分别是varx="abc123";。如果在标记之间放置更多空格,

var    x     =    "abc123"       ;

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

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

不编译。

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

// 注释会忽略该行的其余内容。由于书签仅包含 1 行,因此您将注释掉 // 之后的所有内容。在一个普通的脚本中,你可以有很多行,所以你不会遇到同样的问题。

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

SingleLineComment ::
   // SingleLineCommentCharsopt

SingleLineCommentChars ::
   SingleLineCommentChar SingleLineCommentCharsopt

SingleLineCommentChar ::
    SourceCharacter but not LineTerminator

【讨论】:

  • 啊。这个答案 + @RobG 的评论帮助我更好地理解了一点。换行符是并且不会同时被忽略。在令牌之间出现换行符无关的意义上,它们被“忽略”。它们不会被忽略,因为根据它们出现的位置,词法分析器可能会得到不同的标记(即 cmets)。对吗?
  • 基本上,我希望 David Flanagan 可以在第 2.3 节中提供更多细节:D
  • @linstantnoodles 没错,换行符在词法分析过程中很重要。由于自动插入分号,这比一个句子中简单说的要复杂一些,但你有它的要点。
【解决方案2】:

因为小书签是单行脚本,而常规脚本可以是多行。

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

如果您在书签中使用了//,它会立即停止处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 2011-03-11
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    相关资源
    最近更新 更多