Javascript 为什么我的间歇时间只有一半?

Javascript 为什么我的间歇时间只有一半?,javascript,animation,settimeout,setinterval,clearinterval,Javascript,Animation,Settimeout,Setinterval,Clearinterval,我一直在做我的第一个主要编程项目,到目前为止进展得相当顺利。我的目标是运行动画,直到触发事件或15秒过去。动画超时后,我希望动画重复。我目前对该计划的解决方案如下所示 var animationSpeed = 40; var animationTimout = 375; var testTime = 1; //some more set up variables function onClick() { startDrive();

我一直在做我的第一个主要编程项目,到目前为止进展得相当顺利。我的目标是运行动画,直到触发事件或15秒过去。动画超时后,我希望动画重复。我目前对该计划的解决方案如下所示

    var animationSpeed = 40;
    var animationTimout = 375;
    var testTime = 1;
    //some more set up variables

    function onClick() {
        startDrive();
        setTimeout(startDrive, 15000); //****
    }

    function startDrive() {
        var Driving = setInterval(carDriving, aniSpeed);
    }

    function carDriving() {
        testLocation();
        drawCar();
        angleCalc();
        newLocation();
        getInfo();
    }

    function testLocation() {
        //this code gets information on whether or not the animation should be stopped
        testTime = testTime + 1

        if(a === 1 || testTime > animationTimeout) {
            //a test to cancel the animation, the other variables test to
            clearInterval(Driving);
        }
    }

    function drawCar() {
        //draws the car
    }

    function angleCalc() {
        //gets some info on how to move the car
    }

   function newLocation() {
        //decides on new coords for the car based on angleCalc();
    }

    function getInfo() {
        //gets some info I plan to use later in the project
    }

当我在没有星号的情况下运行代码时,整个过程都正常工作。这辆车按照我的要求进行动画设计,如果满足停车条件,它就会停车。汽车停在画布上的地方,似乎间隔时间已经过去了。当我添加带星号的代码行时,动画似乎可以工作,但运行速度是以前的两倍。我完全迷路了,我尝试的东西都不管用。请提供帮助。

问题可能是由于此处定义的局部变量引起的:

function startDrive() {
    var Driving = setInterval(carDriving, aniSpeed);
}
变量
Driving
仅在函数
startDrive
中定义,它是一个局部变量,因为您使用
var
在函数内部定义它。因此,当您试图在
testLocation()
中访问它时,您并不是在访问同一个变量。事实上,当您执行
clearInterval(Driving)
时,变量
Driving
没有定义。一个简单的解决方案是通过删除
var
,使
驱动成为全局的:

function startDrive() {
    Driving = setInterval(carDriving, aniSpeed);
}
也可以将计时器作为参数传递到
testLocation
函数中。这样,您将正确地清除间隔