JSLint:预期'else {if'而是看到'else if if

Ric*_*ick 4 javascript jslint

我正在尝试验证JavaScript主函数中的提示.基本上它要求10到20之间的数字.如果该值不在该范围内或不是数字,它应该给出错误消息并再次询问.如果输入0或按下取消按钮,则应完全停止例程.

我知道这是非常糟糕的代码,但它对我很有用.

我遇到的问题是当我尝试在JSLint中验证它时,我收到以下错误:

Expected 'else { if' and instead saw 'else if'.
        } else if (amtEntered >= 10 && amtEntered <=20) {
Run Code Online (Sandbox Code Playgroud)

如果我取消注释该return 0语句,则错误消失.

var amt;    
var inputError = false;

do {
    if (inputError) {
        alert ("You have entered an error. \n Please try again.");
    }
    amt = prompt("Enter amount between 10 and 20: ","");
    amt = Number(amt);
    if (isNaN(amt)) {
        inputError = true;
    } else if (amt === null || amt === 0) {
        // If amt is blank or cancel button pressed then exit loop and exit function.
        inputError = false;
        return 0;
    } else if (amt >= 10 && amt <=20) {
        inputError = false;
    } else {
        inputError = true;
    }
}
while (inputError);
Run Code Online (Sandbox Code Playgroud)

非常感谢有关修复此代码的任何提示或建议.

pax*_*blo 5

嗯,你可以解决通过更改其if语句:

if (isNaN(amt)) {
    inputError = true;
} else {
    if (amt === null || amt === 0) {
        // If amt is blank or cancel button pressed then exit loop and exit function.
        inputError = false;
        return 0;
    } else {
        if (amt >= 10 && amt <=20) {
            inputError = false;
        } else {
            inputError = true;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但我认为这只是JSLint迂腐.你拥有的实际上是有效的语法.


我相信JSLint抱怨这样的事情的原因可能是你有这样的代码:

if (condition)
    do_something();
Run Code Online (Sandbox Code Playgroud)

然后有人将其更改为:

if (condition)
    do_something();
    do_something_else();
Run Code Online (Sandbox Code Playgroud)

没有大括号,该代码将无法按预期工作.你是否认为用更多的括号来编写代码的充分理由主要是风格问题.

这种特殊情况很复杂,因为它只发生在return语句中,所以推理更复杂.

查看源代码,它似乎加载整个if块(真正的分支),然后检查下一个令牌是否else.如果if块有一个破坏者(如return),它会抱怨一个不必要的else(如果下一个令牌是else)或没有大括号(如果下一个令牌集是else if):

stmt('if', function () {
    var paren = next_token;
    one_space();
    advance('(');
    step_in('control');
    no_space();
    edge();
    this.arity = 'statement';
    this.first = expected_condition(expected_relation(expression(0)));
    no_space();
    step_out(')', paren);
    one_space();
    this.block = block('if');
    if (next_token.id === 'else') {
        if (this.block.disrupt) {
            next_token.warn(this.elif ? 'use_nested_if' : 'unnecessary_else');
        }
        one_space();
        advance('else');
        one_space();
        if (next_token.id === 'if') {
            next_token.elif = true;
            this.else = statement(true);
        } else {
            this.else = block('else');
        }
        if (this.else.disrupt && this.block.disrupt) {
            this.disrupt = true;
        }
    }
    return this;
});
Run Code Online (Sandbox Code Playgroud)

unnecessary_else很容易弄清楚,这是赶上了诸如:

if (condition) {
    return 0;
} else {
    do_something();
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,最好写成:

if (condition) {
    return 0;
}
do_something();
Run Code Online (Sandbox Code Playgroud)

use_nested_if是在更有趣的,如果括号是一个好主意,他们应该用所有的时间,不只是当块有一个return说法.我不确定为什么作者认为这只是一个块返回时的问题.

如果它真的困扰你,你无疑会修改代码以删除该检查,而不是我轻易做的事情.也许最好让作者将tolerate_non_nested_if选项添加到软件中.或者,如果你知道它没问题,你可以忽略警告.


并且,在进一步反思时,可能是两个警告都使用了相同的推理 - 如果你有一个if返回的块,那之后的任何代码都不应该在等效的else块中,它应该是独立的(但是在任何外部if/else块的上下文当然).

我的意思是你可以使用:

if (isNaN(amt)) {
    inputError = true;
} else {
    if (amt === null || amt === 0) {
        // If amt is blank or cancel button pressed then exit loop and exit function.
        inputError = false;
        return 0;
    } // no else needed here.
    if (amt >= 10 && amt <=20) {
        inputError = false;
    } else {
        inputError = true;
    }
}
Run Code Online (Sandbox Code Playgroud)