2013-12-22 38 views
1

當您編寫JavaScript書籤時,您不能使用//,因爲JavaScript代碼被視爲單行。您必須改用/* ... */。這對我來說沒有意義,因爲即使忽略換行符,也可以在普通腳本中使用//如果JavaScript忽略換行符,它如何解析單行註釋?

部的The Definitive Guide

的JavaScript 2.3忽略空格,製表符,並且在程序 標記之間出現換行符...

然後,在部分的2.5權威指南

...任何te xt和行之間的xt被視爲註釋 ,並被JavaScript忽略...

這些語句看起來矛盾。

根據2.3節,正常腳本幾乎是J.S的單行,因爲換行符被忽略。有人可以向我解釋爲什麼//可能在一個正常的腳本,但不是在書籤?

+3

你似乎忽略了最重要的部分,即*「......那......令牌之間出現」 * – Phil

+0

你可以將boomarklets [這裏](http://gutfullofbeer.net/escape.html)粘貼到網址編碼(和解碼)它們。 – Pointy

+2

聲明「JavaScript忽略空格,製表符和換行符」是錯誤的。它們根本不會被忽略,它們對分離令牌,自動分號插入以及結束具有以下腳本的單行註釋至關重要。請參閱[ECMA-262第7.2節](http://ecma-international.org/ecma-262/5.1/#sec-7.2):「空白字符用於改善源文本的可讀性並分離令牌(不可分割的詞法單位)彼此相關,但是在其他方面微不足道。此外,[Line terminators](http://ecma-international.org/ecma-262/5.1/#sec-7.3)不是空格。 – RobG

回答

3

我要強調的第一次報價

的JavaScript忽略出現標記之間在節目

程序被分成令牌空格,製表符和換行符的一部分。例如,該程序以下

var x = "abc123"; 

有5個令牌,即,varx="abc123";。如果您在令牌之間放置更多空格,那麼

var x  = "abc123"  ; 

這並不重要。但是如果你在一個令牌裏放置一個空間,那麼它可以改變程序。例如,

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

不能編譯。

這種差異是爲什麼這兩個陳述不矛盾。評論是被忽略的單個標記。如果你在評論中間放置一個換行符,那麼你不會在程序中的標記之間放置空格,而是在標記的中間放置一個空格。

A //評論忽略了該行上的其餘內容。由於書籤只包含1行,因此您將在//之後註釋掉所有內容。在一個普通的腳本中,可以有很多行,所以你不會遇到同樣的問題。

如果你很好奇這是怎麼規定的,這裏的relevant part of the grammar in the ECMAScript 5 specification

SingleLineComment :: 
    // SingleLineCommentCharsopt 

SingleLineCommentChars :: 
    SingleLineCommentChar SingleLineCommentCharsopt 

SingleLineCommentChar :: 
    SourceCharacter but not LineTerminator 
+0

啊。這個回答+ @ RobG的評論幫助我理解了一點。換行符是和不被同時忽略的。它們被「忽略」,因爲令牌之間換行符的外觀是不相關的。它們不會被忽略,根據它們出現的位置,詞法分析器可能會得到不同的標記(即註釋)。正確? – linstantnoodles

+0

基本上,我希望David Flanagan可以在第2.3節中提供更多的細節:D – linstantnoodles

+0

@linstantnoodles正確的說,換行符在lexing過程中很重要。這比一個人可以簡單地用一句話說出來要複雜一點,因爲自動分號插入,但你有它的要點。 –

2

因爲書籤是單行腳本,其中作爲常規腳本可以是多行。

2.3節有點含糊。在某些情況下,空白區域很重要,但//只是告訴處理器忽略該行的其餘部分。

如果您在書籤欄中使用了//,那麼它只會停止處理。