Javascript 是否清除启动范围之外的超时?

Javascript 是否清除启动范围之外的超时?,javascript,timer,Javascript,Timer,我找不到在调用函数之外停止间隔计时器的方法。我在下面的代码中遗漏了什么?我是否需要专门声明一个名为timer的全局变量 变量计时器;//全球计时器? 函数updateStatsi{ i++;//增量 alertIm正在运行!增量为+i; 检查条件I; 定时器=设置间隔功能{ 更新STATSI; }, 5000; } 函数检查条件I{ ifi==2{ 满足警报条件,重置计时器!; 间隔定时器; } } var i=0; 更新STATSI 仅创建计时器一次: 变量计时器;//全球计时器? 函数更

我找不到在调用函数之外停止间隔计时器的方法。我在下面的代码中遗漏了什么?我是否需要专门声明一个名为timer的全局变量

变量计时器;//全球计时器? 函数updateStatsi{ i++;//增量 alertIm正在运行!增量为+i; 检查条件I; 定时器=设置间隔功能{ 更新STATSI; }, 5000; } 函数检查条件I{ ifi==2{ 满足警报条件,重置计时器!; 间隔定时器; } } var i=0;
更新STATSI 仅创建计时器一次:

变量计时器;//全球计时器? 函数更新状态{ i++;//增量 alertIm正在运行!增量为+i; 检查条件I; } 函数检查条件I{ ifi==2{ 满足警报条件,重置计时器!; 间隔定时器; } } var i=0;
定时器=SetIntervalueUpdateStats,5000 它确实起作用,而且你确实清除了超时,问题是你每次调用updateStats都会创建多个计时器,每次都会覆盖计时器,失去其他计时器的句柄。为什么每次调用创建新计时器的函数时,都要添加很多计时器

我猜你真的在尝试这样做,间隔只创建一次,而不是每次迭代

var timer;

function updateStats(i) {
    function inner() {
        i++;
        alert("Im running! increment is " + i);
        checkCondition(i);
    }

    timer = setInterval(inner, 5000);
    inner();
}

function checkCondition(i) {
     if(i == 2) {
        alert("condition met, resetting timer!");
        clearInterval(timer);
    }
}

var i = 0;
updateStats(i);
每次运行updateStats时,都会创建一个间隔计时器

在该时间间隔内运行updateStats

因此,当代码第一次运行时,有一个内部计时器正在运行

5秒后你有2个。10秒后,每个间隔开始一个新的间隔,因此有4个,以此类推

它们都共享一个计时器变量,所以它的值将是您设置的最后一个时间间隔,而这是您唯一停止的时间间隔。当所有其他的计时器都在运行时,将您运行的间隔计时器的数量增加一倍,每5秒一次


您需要认真重构代码。

您正在清除计时器,然后立即设置一个全新的计时器。setInterval也只需要调用一次。此时,每次调用循环时,都会生成另一个计时器实例,而您只能清除最后一个实例

看看这个:

var timer,i=0; 
 timer = setInterval(function() {
        updateStats();
 }, 5000);

function updateStats() {
    i++; // increment
    alert("Im running! increment is " + i);

    checkCondition();

}

function checkCondition() {
     if(i == 2) {
        alert("condition met, resetting timer!");
        clearInterval(timer);
    }
}

让我大大简化您的代码:

环0,1000; 函数循环计数,延迟{ alertI正在运行。计数为+++count+。; 如果满足计数===2警报条件,则停止循环。; else setTimeoutloop,delay,count,delay; } 函数窗口,设置超时,设置间隔{ window.setTimeout=fixsetTimeout; window.setInterval=fixsetInterval; 函数固定计时器{ 返回函数回调,间隔{ 变量长度=arguments.length; 开关长度{ 案例0: 案例1: 抛出至少两个参数的新错误; 案例2: 返回时间回调,间隔; 违约: var i=2; var args=新阵列长度-2; 而i@阿迪内奥:这只是一个问题。即使他使用setTimeout而不是setInterval,仍然会出现问题。问题是OP在i==2时清除计时器,然后立即再次设置计时器。