Javascript 为什么要减少代码,只调用一次函数?
有人能解释为什么这两段代码不一样吗 第一个是正确的,Javascript 为什么要减少代码,只调用一次函数?,javascript,node.js,algorithm,ecmascript-6,Javascript,Node.js,Algorithm,Ecmascript 6,有人能解释为什么这两段代码不一样吗 第一个是正确的, if (coolDownTimer.read() === 0) { alert() if (errorCoolDownPeriod > 0) { await coolDownTimer.start() } } else if (coolDownTimer.read() >= errorCoolDownPeriod) { alert() coolDownTimer.reset() } 但是我不喜欢将al
if (coolDownTimer.read() === 0) {
alert()
if (errorCoolDownPeriod > 0) {
await coolDownTimer.start()
}
} else if (coolDownTimer.read() >= errorCoolDownPeriod) {
alert()
coolDownTimer.reset()
}
但是我不喜欢将alert()
写入两次,所以既然errorcooldownpiriod
是一个正数,我想我可以这样做
if (coolDownTimer.read() > 0) {
alert()
if (coolDownTimer.read() === 0) {
// alert()
if (errorCoolDownPeriod > 0) {
await coolDownTimer.start()
}
} else if (coolDownTimer.read() >= errorCoolDownPeriod) {
// alert()
coolDownTimer.reset()
}
}
但当我测试它时,它们的行为却不一样
问题:
为什么这两个代码段的行为不一样?当满足条件
coolDownTimer.read()==0
时,第二个代码段是nop。我猜您会混淆已排序的if
s和if
/然后
/else
s。当满足条件coolDownTimer.read()==0
时,第二个代码段是nop。我猜你混淆了排序的if
s和if
/然后/else
s。在第一段代码中,alert()
在coolDownTimer.read()==0
或coolDownTimer.read()>=errorcooldowntperiod
时执行
正确的重构是:
const timer=coolDownTimer.read();
如果(计时器==0 | |计时器>=错误冷却期){
警惕();
如果(计时器===0&&errorCoolDownPeriod>0){
等待冷却计时器。开始()
}否则如果(计时器!==0){
coolDownTimer.reset()
}
}
更可能的是,您对值有特定的限制,例如,我假设所有值都是实时计时器,因此只包含正值。在第一个代码段中,alert()
在coolDownTimer.read()==0
或coolDownTimer.read()>=errorcooldowntperiod
时执行
正确的重构是:
const timer=coolDownTimer.read();
如果(计时器==0 | |计时器>=错误冷却期){
警惕();
如果(计时器===0&&errorCoolDownPeriod>0){
等待冷却计时器。开始()
}否则如果(计时器!==0){
coolDownTimer.reset()
}
}
更可能的是,您对值有特定的限制,例如,我假设所有值都是实时计时器,因此只包含正值。@Thomas对OP的评论解释了这个问题。您不能让n===0&&n>0
,因此要只调用一次alert()
,您应该这样做
if (coolDownTimer.read() === 0 || coolDownTimer.read() >= errorCoolDownPeriod) {
alert()
if (coolDownTimer.read() === 0) {
// alert()
if (errorCoolDownPeriod > 0) {
await coolDownTimer.start()
}
} else if (coolDownTimer.read() >= errorCoolDownPeriod) {
// alert()
coolDownTimer.reset()
}
}
例如,在新的外部if语句中使用每个条件和/或它们。@Thomas对OP的评论解释了这个问题。您不能让n===0&&n>0
,因此要只调用一次alert()
,您应该这样做
if (coolDownTimer.read() === 0 || coolDownTimer.read() >= errorCoolDownPeriod) {
alert()
if (coolDownTimer.read() === 0) {
// alert()
if (errorCoolDownPeriod > 0) {
await coolDownTimer.start()
}
} else if (coolDownTimer.read() >= errorCoolDownPeriod) {
// alert()
coolDownTimer.reset()
}
}
例如,在新的外部if语句中取每个条件和/或它们。好的coolDownTimer.read()>0
和coolDownTimer.read()==0
看起来它们是不兼容的条件。是的,出于某种原因,但我不明白为什么。if(coolDownTimer.read()>0)。。。if(coolDownTimer.read()==0)
永远不会进入第二个条件,因为如果它进入第一个条件,coolDownTimer.read()
的值永远不会满足第二个条件。你是认真的吗?一个数字可以同时是零和非零吗?@sandraschlich因为一个值不能同时是n===0&&n>0
那么coolDownTimer.read()>0
和coolDownTimer.read()==0
看起来它们是不兼容的条件。是的,出于某种原因,但我不明白为什么。if(coolDownTimer.read()>0) ... if(coolDownTimer.read()==0)
永远不会进入第二个条件,因为如果它进入第一个条件,coolDownTimer.read()
的值永远不会满足第二个条件。你是认真的吗?一个数字可以同时为零和非零吗?@SandraSchlichting,因为一个值不能同时为n===0&&n>0
,因为她没有加入到问题下已经进行的讨论中,也因为她没有说一种语言,OP可以理解,因为她缺乏布尔逻辑。这个问题甚至不应该被回答。由于没有加入到问题下已经进行的讨论中,也因为没有说OP可以理解的语言而被否决,因为她缺乏布尔逻辑。这个问题甚至不应该被回答。你的意思是因为这个const timer=coolDownTimer.read()
?你的意思是因为这个const timer=coolDownTimer.read()
?@Sandra,我认为重复这些条件实际上比重复alert()
更不干净。如果alert()
实际上是一个较大的代码段,那么将其提取到一个helper函数中,这样您就可以真正调用它两次,这可能是有意义的。@Sandra和我认为重复alert()
的条件实际上没有那么干净。如果alert()
实际上是一个较大的代码段,那么将其提取到一个helper函数中,这样您就可以真正地调用它两次。