Javascript setInterval clearInterval简单示例不工作解释?

时间:2013-09-23 10:39:04

标签: javascript setinterval clearinterval

我有一个非常简单的JS setInterval和clearInterval示例,它不起作用。必须有一个潜在的原因,为什么它不起作用,我想知道为什么:

 var automessage;

 function turnON() //executed by onclick event A
 {
   var automessage = setInterval(function(){ something() }, 2000);
 }

 function turnOff() //executed by onclick event B
 {
   clearInterval(automessage);
 }

 function something()
 {
   //pulls instant messages
 }

在此示例中,最终用户单击按钮以启动定时间隔过程,单击另一个按钮以停止定时间隔过程,然后再次单击“打开”按钮以再次启动该过程。从本质上讲,它将是一个开/关风格的过程。

这不起作用,我试图找出原因。我可以使Stackoverflow上提供的所有其他数百个示例都可以工作,但我真的需要一个开/关样式的进程,不仅限于on,然后off。 setInterval应该能够随时打开和关闭。

我非常感谢任何人的帮助。另外,我不使用任何Jquery库。

3 个答案:

答案 0 :(得分:8)

automessage被声明两次 - 作为全局变量和局部变量。尝试:

function turnON() //executed by onclick event A
{
    automessage = setInterval(function(){ something() }, 2000);
}

答案 1 :(得分:2)

var automessage;

function turnON() { //executed by onclick event A 
    automessage = setInterval(function(){ something() }, 2000);
}
function turnOff() { //executed by onclick event B
    clearInterval(automessage);
}
function something() {
    //pulls instant messages
}

此代码应该有效。你的工作不起作用,因为在turnON函数的上下文中,你总是初始化一个名为automessage的新变量,它会混淆全局变量。如果不使用var,您将覆盖automessage全局变量。

automessage是一个全局变量,因此可以从任何其他脚本编辑。因为,恕我直言,它应该是不可能的,我建议你使用一个闭包来封装并使私有 automessage变量(类似于模块化模式应该对你有所帮助,见下文)。

var buttonModule = (function() {
    var _automessage;
    function turnON() { //executed by onclick event A 
        _automessage = setInterval(_something, 2000);
    }
    function turnOFF() { //executed by onclick event B
        clearInterval(_automessage);
    }
    function _something() {
        //pulls instant messages
    }
    return {
        turnON: turnON,
        turnOFF: turnOFF
    };
})();

然后您可以这样使用它: 在您的点击处理程序中buttonModule.turnONbuttonModule.turnOFF

答案 2 :(得分:1)

更改

var automessage = setInterval(function(){ something() }, 2000);

automessage = setInterval(function(){ something() }, 2000);

转入ON()