恶劣的逃亡&未封闭的字符串

时间:2011-11-11 05:31:30

标签: javascript string jslint

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>';

有谁知道为什么这会在JSLint中返回2个错误?

这是2个错误的图像:

enter image description here

1 个答案:

答案 0 :(得分:4)

简短回答,您需要配置JSLint以容忍ECMAScript 5.

这可以通过以下方式完成:

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

答案很长:

序列\后跟行终止符,直到最近才真正有效Javascript(版本5,2009年12月)。

从ECMAScript(ECMA-262)标准的上一次迭代(版本3)开始,第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 

由于\之后的下一个字符既不是0xu,唯一的选择是CharacterEscapeSequence,其归结为{{1} (不是因为行终止符不是列出的那些字符之一)或SingleEscapeCharacter(明确排除行终止符的可能性)。

该部分的底部还有这个注释:

  

注意:“LineTerminator”字符不能出现在字符串文字中,即使前面有反斜杠也是如此。使行终止符字符成为字符串文字的字符串值的一部分的正确方法是使用转义序列,例如\ n或\ u000A。


现在,ECMAScript 5 稍微改变了。从那里开始,他们修改了NonEscapeCharacter的定义:

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

LineContinuation ::
    \ LineTerminatorSequence

并将注释修改为:

  

注意:行终止符不能出现在字符串文字中,除非作为生成空字符序列的LineContinuation的一部分。使行终止符字符成为字符串文字的String值的一部分的正确方法是使用转义序列,例如\ 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).

如果您向下滚动到标记部分,则会有一个SingleStringCharacter条目,当设置该条目时,将删除该错误。