Плохой побег и незакрытая строка

var freebie = ' \
    <div class="item'+last+'" data-type="psd" data-visited="false"> \
      <div class="baseBubble" /> \
      <div class="baseStroke" /> \
      <div class="baseThickerStroke" /> \
      <div class="thumbnail"> \
        <div class="overlay" /> \
        <img src="'+item['thumb'][0]+'" width="'+item['thumb'][1]+'" height="'+item['thumb'][2]+'" /> \
      </div> \
    </div>';

Кто-нибудь знает, почему это возвращает 2 ошибки в JSLint?

Вот изображение 2 ошибок:

введите здесь описание изображения


person daryl    schedule 11.11.2011    source источник
comment
Меня совсем не удивит, если г-н Крокфорд не одобрит использование \ в конце строк. Кроме того, из справки JSLint: JSLint также проверяет наличие '‹/' в строковых литералах. Вместо этого вы всегда должны писать '‹\/'. - это может быть плохой частью спуска. (Ваш код работает, не так ли? Если да, то я бы проигнорировал эти ошибки.)   -  person nnnnnn    schedule 11.11.2011
comment
Да, работает, просто любопытство. Спасибо!   -  person daryl    schedule 11.11.2011


Ответы (1)


Короткий ответ: вам нужно настроить JSLint для работы с ECMAScript 5.

Это можно сделать с помощью:

/*jslint es5: true, all-your-other-jslint-options */

Длинный ответ:

Последовательность \, за которой следует разделитель строки, до недавнего времени (версия 5, декабрь 2009 г.) фактически не была допустимой для Javascript.

Из предыдущей итерации (версия 3) стандарта ECMAScript (ECMA-262) в разделе 7.8.4 говорится: (с удаленными некоторыми ненужными записями):

StringLiteral ::
    " DoubleStringCharacters(opt) "
    ' SingleStringCharacters(opt) '

SingleStringCharacters ::
    SingleStringCharacter SingleStringCharacters(opt)

SingleStringCharacter ::
    SourceCharacter but not single-quote ' or backslash \ or LineTerminator
    \ EscapeSequence

Таким образом, последовательность, которую вы имеете, заканчивается последней строкой выше, одиночным \, за которым следует элемент синтаксиса EscapeSequence. Изучение этого дальше:

EscapeSequence ::
    CharacterEscapeSequence
    0 [lookahead ∉ DecimalDigit]
    HexEscapeSequence
    UnicodeEscapeSequence

CharacterEscapeSequence ::
    SingleEscapeCharacter
    NonEscapeCharacter

SingleEscapeCharacter :: one of
    ' " \ b f n r t v

NonEscapeCharacter ::
    SourceCharacter but not EscapeCharacter or LineTerminator

EscapeCharacter ::
    SingleEscapeCharacter
    DecimalDigit
    x
    u

HexEscapeSequence ::
    x HexDigit HexDigit

UnicodeEscapeSequence ::
    u HexDigit HexDigit HexDigit HexDigit 

Поскольку следующий символ после \ не является ни 0, ни x, ни u, единственной альтернативой является CharacterEscapeSequence, который сводится либо к SingleEscapeCharacter (не тот случай, поскольку разделитель строки не является одним из перечисленных символов ), либо к NonEscapeCharacter (что явно исключает признак конца строки (возможно).

Внизу этого раздела также есть примечание:

ПРИМЕЧАНИЕ. Символ «LineTerminator» не может появляться в строковом литерале, даже если ему предшествует обратная косая черта. Правильный способ сделать символ конца строки частью строкового значения строкового литерала — это использовать управляющую последовательность, такую ​​как \n или .


Теперь ECMAScript 5 изменил это немного. Начиная оттуда, они изменили определение SingleStringCharacter таким образом:

SingleStringCharacter ::
    SourceCharacter but not one of ' or \ or LineTerminator
    \ EscapeSequence 
    LineContinuation

LineContinuation ::
    \ LineTerminatorSequence

и изменил примечание следующим образом:

ПРИМЕЧАНИЕ. Символ конца строки не может появляться в строковом литерале, кроме как как часть LineContinuation для создания пустой последовательности символов. Правильный способ сделать символ конца строки частью значения String строкового литерала — это использовать управляющую последовательность, такую ​​как \n или .

И вместо того, чтобы ломать JSLint для всех существующих сценариев, авторы разумно решили сделать поддержку ECMAScript 5 необязательной, требуя изменения параметров JSLint для ее активации. Таким образом, он разрешит ECMAScript 5 только в том случае, если вы явно укажете это.

Вы можете посетить веб-сайт http://www.jslint.com/ и подтвердить это:

Code:
    var xyzzy = ' \
    hello";
Error:
    Problem at line 1 character 16: This is an ES5 feature.
var xyzzy = ' \
    Problem at line 2 character 13: Unclosed string.
hello";
    Problem at line 2 character 13: Stopping. (66% scanned).

Если вы затем прокрутите вниз до раздела флагов, там будет запись для Tolerate ES5 syntax, которая при установке удалит эту ошибку.

person paxdiablo    schedule 11.11.2011
comment
Да, я имею в виду, что это не мешает ему работать, просто любопытно, почему это ошибка, спасибо. - person daryl; 11.11.2011
comment
@Brogrammer, почему это ошибка, я обновил свой ответ, указав детали синтаксиса ECMAScript. Что касается того, почему он вообще работает, то это, вероятно, результат не совсем соответствующих стандартам реализаций. - person paxdiablo; 11.11.2011
comment
Какую версию стандарта вы имеете в виду? В стандарте, который я рассматривал (ECMA-262), говорится, что LineContinuation в строковом литерале представляет собой обратную косую черту, за которой следует LineTerminatorSequence. Признак конца строки не может встречаться ни в одном токене, кроме StringLiteral. Завершающие строки могут встречаться только в токене StringLiteral как часть LineContinuation. ecma-international.org/publications/standards/Ecma-262.htm< /а> - person nnnnnn; 11.11.2011
comment
@nnnnnn: я смотрел на 3. В 5.0 было внесено изменение, чтобы разрешить эту последовательность, поэтому я обновил ответ. Скорее всего, JSLint работает либо по старым, либо по более строгим правилам. - person paxdiablo; 11.11.2011
comment
Прохладно. Я никогда не слишком беспокоился о синтаксисе продолжения строки, потому что мне все равно не нравится его использовать — я бы предпочел объединить отдельные строки для каждой строки, потому что мне легче обнаруживать ошибки. Но, может быть, это только я. - person nnnnnn; 11.11.2011