2

我有一个非常简单的 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
 }

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

这不起作用,我试图找出原因。我可以让 Stackoverflow 上提供的数百个其他示例都可以工作,但我真的需要一个开/关风格的过程,不仅限于开,然后关。setInterval 应该可以随时打开和关闭。

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

4

3 回答 3

8

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

function turnON() //executed by onclick event A
{
    automessage = setInterval(function(){ something() }, 2000);
}
于 2013-09-23T10:42:05.903 回答
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你的点击处理程序中。

于 2013-09-23T10:42:31.937 回答
1

改变

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

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

依次打开()

于 2013-09-23T10:44:37.960 回答