Javascript 当只有一个递归函数应该运行时,两个递归函数试图同时执行

Javascript 当只有一个递归函数应该运行时,两个递归函数试图同时执行,javascript,Javascript,基本上,我正在尝试创建一个有2个按钮的网页;一个会导致屏幕随机闪烁,另一个会导致屏幕慢慢改变颜色。我希望能够在这两个按钮之间切换(如果你按下第一个按钮,它开始闪烁,然后如果你按下第二个按钮,它会慢慢地改变,而没有任何取消按钮) 每个按钮都调用一个函数,该函数将另一个函数的“running”变量设置为false,将其自身的“running”变量设置为true。然后它调用一个递归函数(递归的,因为它只是一遍又一遍地调用自己)。这些递归函数仅在其“running”变量为true时执行其代码 如果运行代

基本上,我正在尝试创建一个有2个按钮的网页;一个会导致屏幕随机闪烁,另一个会导致屏幕慢慢改变颜色。我希望能够在这两个按钮之间切换(如果你按下第一个按钮,它开始闪烁,然后如果你按下第二个按钮,它会慢慢地改变,而没有任何取消按钮)

每个按钮都调用一个函数,该函数将另一个函数的“running”变量设置为false,将其自身的“running”变量设置为true。然后它调用一个递归函数(递归的,因为它只是一遍又一遍地调用自己)。这些递归函数仅在其“running”变量为true时执行其代码

如果运行代码段,您会发现程序非常不一致(您可能需要使用它一段时间才能看到问题,因为它有时似乎可以工作)。有时它拒绝更改函数,而另一些时候这两个函数似乎都处于活动状态,它们都试图执行(看起来它们几乎是在争夺控制权)。我不明白这是怎么发生的,因为我相信,任何时候只有一个“正在运行”的变量是真的

var runningDisco=false;
var RunningColors=假;
函数startColor(){
if(runningDisco==true);//disco正在运行吗?
{
runningDisco=false;//如果是,请停止它
}
runningcolors=true;//表示我们正在运行
setTimeout(颜色,100,0);//运行
}
函数startDisco(){
如果(RunningColors==真){
运行颜色=错误;
}
runningDisco=true;
设置超时(Disco,100);
}
函数Disco(){
如果(runningDisco==true){
hex=“#”;
用于(DISCOUNT=0;DISCOUNT<6;DISCOUNT++){
hex=hex.concat((数学地板(数学随机()*17)).toString(16));
}
document.body.style.background=hex;
设置超时(Disco,10);
}
}
功能颜色(颜色计数){
如果(RunningColors==真){
如果(颜色计数>359){
色数-=359;
}
document.body.style.background=“hsl(“+colorcount+”,50%,50%)”;
设置超时(颜色,10,颜色计数+1);
}
}
输入{
字体系列:“Roboto”,无衬线;
文本对齐:居中;
背景色:#dd1021;
边界:无;
颜色:白色;
填充:16px 32px;
文字装饰:无;
利润:4倍2倍;
光标:指针;
}

if语句后面的分号会导致问题

例如,替换:

 if (runningColours == true); {
 if (runningDisco == true); {


.

对于那些刚接触JavaScript的人,您犯了一个常见的错误—在if头后面加了一个分号。这将创建一个没有正文的if语句,后面是一个包含单个语句runningcolors=false的块,该语句将无法正确执行。以下内容应能解决此问题:

if (runningColours == true)
{
    runningColours = false;
}
以下JSFIDLE链接应具有脚本的工作版本:
我希望它开始工作,您可以继续学习JavaScript。

真正的问题是
Disco
colors
函数中
if
语句后面的分号:

if (runningDisco == true); {
  document.body.style.background = …
}
将作为

if (runningDisco == true)
  ;
{
  document.body.style.background = …
}
它运行内容而不考虑布尔变量。为什么有时候它会起作用?我猜,当两个
setTimeout
回调运行得足够近时,只有后者才被呈现出来,这感觉是一致的。当然,他们确实在为争夺银幕时间而互相争斗

  • 分号放错地方了
  • 如果需要运行单个动画,则需要使用单个全局变量来保存超时处理程序,并在启动新的超时处理程序时将其清除
  • 像这样:

    var运行;
    函数startColor(){
    clearTimeout(运行);
    running=setTimeout(颜色,100,0);//Run
    }
    函数startDisco(){
    clearTimeout(运行);
    运行=设置超时(Disco,100);
    }
    函数Disco(){
    var hex=“#”;
    用于(DISCOUNT=0;DISCOUNT<6;DISCOUNT++){
    hex=hex.concat((数学地板(数学随机()*17)).toString(16));
    }
    document.body.style.background=hex;
    运行=设置超时(Disco,10);
    }
    功能颜色(颜色计数){
    如果(颜色计数>359){
    色数-=359;
    }
    document.body.style.background=“hsl(“+colorcount+”,50%,50%)”;
    运行=设置超时(颜色,10,颜色计数+1);
    }
    输入{
    字体系列:“Roboto”,无衬线;
    文本对齐:居中;
    背景色:#dd1021;
    边界:无;
    颜色:白色;
    填充:16px 32px;
    文字装饰:无;
    利润:4倍2倍;
    光标:指针;
    }
    
    
    我不明白你的标题。这是个问题还是什么?请澄清标题使用
    setTimeout
    运行同一个函数不是真正的递归。是的,这就是为什么我说递归,因为它只是一遍又一遍地调用自己。不确定像这样的东西的正确名称是什么可能是“递归”这个词更合适。是的,我似乎在if语句中添加了内容,但忘记了删除它们,然后将if语句复制到其他位置,不。无论是否使用分号,结果都是相同的-
    runningcolors
    在此之后设置为
    false
    。@Bergi在“start”函数中,您是正确的,但是在
    colors
    Disco
    功能中,这就是我看到的问题的原因。但你的回答并没有说,一个问题是。一个逻辑问题是在切换if语句时没有清除间隔,大括号中的代码总是被执行。这更像是递归函数、Disco和COLORS中的一个问题,这是一个很好的建议,但与OP提出的问题无关about@SkinnyJ不是真的。OP试图解决的最初问题是“…我希望能够在这两者之间切换”。他的密码有问题。我提供了一个更好的解决方案
    if (runningDisco == true)
      ;
    {
      document.body.style.background = …
    }