Bad Escapement & Unclosed String - PullRequest
       7

Bad Escapement & Unclosed String

4 голосов
/ 11 ноября 2011
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 ошибок:

enter image description here

1 Ответ

4 голосов
/ 11 ноября 2011

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

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

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

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

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

Из предыдущей итерации (версия 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' не может появляться в строковом литерале, даже если ему предшествует обратный слеш.Правильный способ заставить символ конца строки быть частью строкового литерала - это использовать escape-последовательность, такую ​​как \ n или \ u000A.


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

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

LineContinuation ::
    \ LineTerminatorSequence

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

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

И вместо того, чтобы прерывать 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, которая при установке удалит эту ошибку.

...