2

我一直认为,JS 源代码中的新行无关紧要。为什么有时新线路很重要?

错误:

function x(y)
{
    return 
    {   y : y,
        z : y*2
    } 
}
console.info(x(5).z);

抛出一个SyntaxError: missing ; before statement at z : y*2(指向:

但这是有效的:

function x(y)
{
    return (
    {   y : y,
        z : y*2
    } )
}
console.info(x(5).z);

节目10

这也有效:

function x(y)
{
    return {
        y : y,
        z : y*2
    } 
}
console.info(x(5).z);
4

3 回答 3

3

换行符在 JavaScript 中很重要,因为Automatic Semicolon Insertion是解析器将根据规范中规定的规则插入“缺失”分号的想法。

在您的代码中,它将在 ,;之后的后面return的行之前插入一个。

使用自动插入;的存在,很清楚为什么会出现语法错误:

function x(y)
{
    return ; // <== Added by ASI
    {   y : y,
        z : y*2
    } 
}
console.info(x(5).z);

现在,{之后;是块的开头,而不是对象初始化器,因此解析器将y视为语句标签,然后它会看到看起来像逗号运算符的表达式语句的开头,但:之后z在该位置无效,因此存在错误。

但是, ASI 不适用于表达式,这就是为什么两者

return {
    y: y,
    z: y*2
};

return (
{
    y: y,
    z: y*2
});

工作。

于 2014-01-26T12:21:40.703 回答
1

有两个问题:“;” 被浏览器自动添加到返回行,你漏掉了一个“;” 在返回中的对象声明之后。您永远不应依赖自动添加“;”,因为在那之后您将无法缩小您的 javascript 代码。

使用“1TBS”表示法不会有这个问题。(我也称之为“埃及符号”的符号):所以总是把花括号放在前一个语句的末尾。 http://en.wikipedia.org/wiki/Indent_style

这个问题已经在这里讨论过了: 有没有办法让 jslint 在我的 javascript 的下一行使用花括号?

因此,您的代码的正确表示法应该是:

function x(y){
    return {
        y : y,
        z : y*2
    }; 
}
console.info(x(5).z);

你可以使用 jshint 来检查你的代码风格。

于 2014-01-26T13:17:27.230 回答
1

由于自动分号插入(AST),该return语句受制于该语句。由于语句出现的行不分号结尾,编译器会自动添加一个。因此,您只剩下:

return;
{   y : y,
    z : y*2
}

这是一个返回语句,后面跟着一个明显无法访问的代码块。块中的代码在语法上无效,您会收到上述错误。

在同一行添加左括号或对象文字的左大括号会return阻止 AST 工作,因为在它之后添加分号会导致return语句本身在语法上无效。

于 2014-01-26T12:22:48.533 回答