2013-12-22 3 views
1

Когда вы пишете закладки букв JavaScript, вы не можете использовать //, потому что код JavaScript рассматривается как одна строка. Вместо этого вы должны использовать /* ... */. Это не имеет смысла для меня, потому что вы можете использовать // в обычных скриптах, даже если символы новой строки игнорируются.Как JavaScript анализирует отдельные строки, если он игнорирует символы новой строки?

В разделе 2.3 из The Definitive Guide

JavaScript игнорирует пробелы, символы табуляции и новой строки, которые появляются между токенов в программах ...

Затем в секции 2,5 из Окончательное руководство

... Любой te х между // и концом строки рассматривается как комментарий и игнорируется JavaScript ...

Эти заявления кажутся противоречащими друг другу.

Согласно разделу , раздел 2.3, обычный скрипт является в значительной степени одной строкой J.S, так как символы новой строки игнорируются. Может кто-нибудь объяснить мне, почему // возможен в обычном скрипте, но не в букмаркете?

+3

Вы, кажется, не обращая внимания на самую важную часть, то есть * «..., которые появляются между маркерами ...» * – Phil

+0

You можно вставить boomarklets [здесь] (http://gutfullofbeer.net/escape.html), чтобы URL-адрес закодировал (и unencode) их. – Pointy

+2

Заявление «JavaScript игнорирует пробелы, табуляции и новые строки» неверно. Они не игнорируются вообще, они важны для разделения токенов, для автоматической установки вставки с запятой и для завершения одиночных комментариев, которые имеют следующий сценарий. См. [ECMA-262 §7.2] (http://ecma-international.org/ecma-262/5.1/#sec-7.2): «Символы пробела используются для улучшения удобочитаемости исходного текста и для разделения токенов (неделимых лексических единиц) друг от друга, но в ином случае несущественны. Кроме того, [Линейные терминаторы] (http://ecma-international.org/ecma-262/5.1/#sec-7.3) не являются пробелами. – RobG

ответ

3

Позвольте мне подчеркнуть, часть первой котировки

JavaScript игнорирует пробелы, символы табуляции и новой строки, которые появляются между токенов в программах

Программы подразделяются на маркеры. Например, следующая программа

var x = "abc123"; 

имеет 5 маркеров, а именно, var, x, =, "abc123" и ;. Если вы ставите больше пробелов между токенами,

var x  = "abc123"  ; 

не имеет значения. Но если вы поместите пробел внутри токена, тогда он может изменить программу. Например,

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

не скомпилируется.

Эта разница заключается в том, почему эти два утверждения не противоречат друг другу. Комментарий - это единственный токен, который игнорируется.Если вы помещаете новую строку в середине комментария, то вы не помещаете промежуток между токенами в программе, вы помещаете пространство в середину токена.

A // комментарий игнорирует остальную часть содержимого на линии. Так как букмарклеты содержат только одну строку, вы будете комментировать все после //. В обычном скрипте у вас может быть много строк, поэтому у вас нет такой же проблемы.

Если вам интересно, как это указано, вот relevant part of the grammar in the ECMAScript 5 specification:

SingleLineComment :: 
    // SingleLineCommentCharsopt 

SingleLineCommentChars :: 
    SingleLineCommentChar SingleLineCommentCharsopt 

SingleLineCommentChar :: 
    SourceCharacter but not LineTerminator 
+0

Ах. Этот ответ + комментарий RobG помог мне понять немного лучше. Newlines ARE и НЕ игнорируются одновременно. Они «игнорируются» в том смысле, что появление новых строк между токенами не имеет значения. Они не игнорируются в том смысле, что в зависимости от того, где они появляются, лексер может получать разные токены (т. Е. Комментарии). Верный? – linstantnoodles

+0

В принципе, я бы хотел, чтобы Дэвид Фланаган мог более подробно рассказать в разделе 2.3: D – linstantnoodles

+0

@linstantnoodles. В начале процесса лексики важны новые строки. Это немного сложнее, чем просто сказать в одном предложении из-за автоматической вставки точки с запятой, но у вас есть суть этого. –

2

Поскольку букмарклет - это сценарий с одной строкой, где в качестве обычного скрипта может быть много строк.

Раздел 2.3 немного расплывчатый. Бывают случаи, когда пустое пространство имеет значение, но // просто говорит процессору игнорировать остальную часть этой строки.

Если вы использовали // в буклементе, он просто прекратил бы обработку прямо там.

Смежные вопросы