编写JavaScript bookmarklet时,不能使用//
,因为JavaScript代码被视为一行。您必须使用/* ... */
。这对我没有意义,因为即使忽略换行符,您也可以在普通脚本中使用//
。
JavaScript会忽略显示在其间的空格,制表符和换行符 程序中的令牌......
然后,在“权威指南”的第2.5节
中... //和行尾之间的任何文本都被视为注释 并被JavaScript忽略......
这些陈述似乎是矛盾的。
根据第2.3节,正常脚本几乎是J.S的一行,因为新行被忽略。有人可以向我解释为什么//
在普通脚本中是可能的,而不是在书签中?
答案 0 :(得分:4)
让我强调第一句话的一部分
JavaScript忽略在程序中的标记之间出现的空格,制表符和换行符
程序分为令牌。例如,以下程序
var x = "abc123";
有5个令牌,即var
,x
,=
,"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节有点模糊。在某些情况下,空格很重要,但//
只是告诉处理器忽略该行的其余部分。
如果您在书签中使用//
,那么它就会停止处理。