在编写JavaScript bookmarklet时,不能使用//
,因为JavaScript代码被视为一行。您必须使用/* ... */
。这对我来说没有意义,因为即使换行符被忽略,您也可以在普通脚本中使用//
。
在最终指南的第2.3节中
JavaScript忽略出现在程序中的令牌。。。
然后,在最终指南的第2.5节中
。。。//和行尾之间的任何文本都被视为注释并且被JavaScript忽略。。。
这些说法似乎自相矛盾。
根据第2.3节,由于换行符被忽略,因此正常脚本几乎也是J.S的一行。有人能向我解释一下为什么//
在普通脚本中是可能的,而在bookmarklet中是不可能的吗?
让我强调第一句话的一部分
JavaScript忽略程序中标记之间出现的空格、制表符和换行符
程序被划分为令牌。例如,以下程序
var x = "abc123";
具有5个令牌,即var
、x
、=
、"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中使用//
,它就会立即停止处理。