JS定时器无法清除?

 function loginState(is) {
        var msg = $("#submit_btn");
        var count = 0;
        var clear = is;
        var pints_interval;
        //触发定时器
        pints_interval = setInterval(repeat, 500);
        function repeat() {
            if (clear) {
                var mval = msg.val();
                if (count < 3) {
                    count++;
                    mval += ".";
                    msg.val(mval);
                }
                else {
                    msg.val("登录");
                    count = 0;
                }
            } else if (!clear) {
                if (pints_interval) {
                    clearInterval(pints_interval); //清除定时器
                    pints_interval = null;
                }
            }
        }
    }

loginState(true);函数传入true OR false 为什么先传入true启动定时器,之后传入false无法清除定时器

阅读 12.5k
3 个回答

诚邀。

第一次传入true和第二次传入false执行的interval是不一样的。你可以这样试试

 function loginState(is) {
        var clear = is;
        var pints_interval;
        //触发定时器
        pints_interval = setInterval(repeat, 500);
        function repeat() {
            if (clear) {
                console.log('excute interval and the id is: ' + pints_interval );
            } else if (!clear) {
                if (pints_interval) {
                    clearInterval(pints_interval); //清除定时器
                    console.log('clear intervaland the id is: ' + pints_interval );
                    pints_interval = null;
                }
            }
        }
    }

运行上诉代码,你自然就会明白。

所以你的clearInterval函数不应该写在repeat函数中。

你传入了true后,根据函数流程设定了定时器,传入false后,又新建了一个定时器...不过由于传入的为false,所以后面的定时器就直接被清除了...所以操作的方式不对.
可以通过其它方式来控制clear的值

 function loginState(is) {
    //.......................
       return function(){
         clear = false;
       }
 }
 var stop = loginState(true);
 stop();
 

方法有很多

两次的repeat函数不是同一个(JS的函数作用域)

可以定义全局的repeat

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题