我正在尝试验证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)
非常感谢有关修复此代码的任何提示或建议.
嗯,你可以解决通过更改其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)
| 归档时间: |
|
| 查看次数: |
2340 次 |
| 最近记录: |