如何停止setInterval调用

时间:2016-02-28 18:08:23

标签: javascript function settimeout

我有两个HTML按钮。第一个按钮启动下面的JavaScript函数:

function generations(){
    var refresh = setInterval(function(){ mutation() }, 1000);
}

效果很好。我想第二个按钮结束setInterval。我试过这样:

function stop(){
    clearInterval(refresh);
}

不起作用。如果我定义"刷新"它可以工作。函数之外的变量,但是当我想要的时候我就无法启动它,它只是自动启动。这两个函数在单独的.js文件中定义。

帮助!

5 个答案:

答案 0 :(得分:4)

您需要在外面声明并分配作业。设置内部间隔:

var refresh;
function generations(){
    refresh = setInterval(function(){ mutation() }, 1000);
}

停止:

function stop(){
    if (refresh) { 
       clearInterval(refresh); 
    }
}

答案 1 :(得分:1)

refresh仅限于generations()

的范围

您必须将refresh设为全局或将其作为参数传递给stop()

答案 2 :(得分:1)

在您的代码中,“refresh”变量仅对其所在的函数是本地的。如果你以这种方式保留它,你应该做这样的事情:

var refresh;

function generations(){
    refresh = setInterval(function(){ mutation() }, 1000);
}

function stop(){
    clearInterval(refresh);
}

答案 3 :(得分:1)

Javascript中的范围

Javascript中有两种不同的范围,第一种称为本地范围,第二种称为全局范围 。范围定义了其他函数对变量的访问量。以下是它的工作原理(实质上):

  • var关键字在当前范围声明变量。在函数内部,这是本地范围,在函数外部,这是全局范围。
  • 从那时起,该变量只能在该范围内访问。
  • 本地范围仅限于一个功能。本地范围内的变量只能从该函数中访问,并在完成运行后删除。
  • 全局范围位于所有功能中。它可以被所有函数访问,只有在浏览器选项卡/窗口关闭时才被删除(或者Javascript进程被终止)。

请注意,我们通常喜欢在本地范围局部变量中调用变量,在全局范围全局变量中调用变量。

在您的代码中

您声明的变量refresh是一个局部变量,因为您在generations函数中将其声明为内联。因此,它只能在该功能的范围内访问,而不能访问任何其他功能。这意味着stop函数无法使用它。

如果您希望refresh可以访问stop,则需要全局范围 - 即刷新需要在函数之外声明。这意味着代码中的所有其他函数都可以读取/写入。

新代码的外观示例(这解决了您的问题):

var refresh; //Declare refresh in the global scope, but don't assign it a value
function generations(){
    refresh = setInterval(function(){ mutation() }, 1000); //Assign a value
}
function stop(){
    clearInterval(refresh); //Read that value
}

答案 4 :(得分:0)

要记住的一件事是你必须在重新初始化之前清除你的间隔。

将刷新变量保留在外部范围内,以便您也可以引用它。

 Math.Round(Convert.ToDouble(pData), 4).ToString()