我有一个非常简单的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库。
答案 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.turnON
,buttonModule.turnOFF
。
答案 2 :(得分:1)
更改
var automessage = setInterval(function(){ something() }, 2000);
到
automessage = setInterval(function(){ something() }, 2000);
转入ON()