搜索

首页  >  问答  >  正文

javascript - 关于定时器里面n次数不增加怎么办

里面的n次数不增加不知道是什么原因,还有就是执行了三次以后怎么清除执行。

var firstShow = 1000;
var secondShow = 5000;
var threeShow = 10000;

setTimeout(openMpM, firstShow);
function openMpM() {
    $("#swtCenter2").fadeIn(1000);
}

var n = 0;
function closeM(n) {
    $("#swtCenter2").fadeOut(1000);
    setTimeout(openMpM, 50000);
    n = n++;
    if (n == 1) {
        setTimeout(openMpM, secondShow);
    }
    if (n == 2) {
        setTimeout(openMpM, threeShow);
    }
    if (n == 3) {
        clearTimeout();
    }
}
曾经蜡笔没有小新曾经蜡笔没有小新2721 天前735

全部回复(3)我来回复

  • 代言

    代言2017-06-12 09:34:09

    绑定事件里面先n++再执行closeM(n),closeM(n)里面的n=n++要去掉。

        $("#swtCenter2").on('click',function(){
                n=n+1
                closeM(n)
            });

    第三次直接if (n==3) {$("#swtCenter2").fadeOut(1000);}就行了
    或者这样

            var n=0;
            function closeM() {
            $("#swtCenter2").fadeOut(1000);
            n=n+1;
            return function (n){
                console.log(n)
                if(n==1){setTimeout(openMpM,secondShow);
                }
                if(n==2){setTimeout(openMpM,threeShow);
                }
                if(n==3){$("#swtCenter2").fadeOut(1000);}}
            }
            $("#swtCenter2").on('click',function(){
                closeM()(n);
            });

    回复
    0
  • 高洛峰

    高洛峰2017-06-12 09:34:09

    其实你这个思路基本上已经很清楚了,只是在细节上还有点逻辑不清。比如 setTimeout(openMpM, 50000); 这句话会在每次 closeM() 的时候执行,与 n 值无关。

    另外 n = n++ 不会改变 n 值,它相当于

    var t = n;
    n++;
    n = t;

    下面是我修改后的代码,这个问题和你另外问的那个是同一个,我就不去那边回答了。

    var firstShow = 1000;
    var secondShow = 5000;
    var threeShow = 10000;
    
    // 定义成数组,便于按序号取用
    var showTimes = [firstShow, secondShow, threeShow];
    
    setTimeout(openMpM, firstShow);
    function openMpM() {
        $("#swtCenter2").fadeIn(1000);
    }
    
    var n = 0;
    function closeM(n) {
        $("#swtCenter2").fadeOut(1000);
    
        // 取出需要等待的时间,并 n + 1
        // 你用的 n = n++ 实际并不会改变 n 值
        var time = showTimes[n++];
    
        if (!time) {
            // 未取到 time 值,说明 3 个时间已用完
            // 重置 n 并且不再延时打开
            n = 0;
        } else {
            setTimeout(openMpM, time);
        }
    }

    回复
    0
  • 大家讲道理

    大家讲道理2017-06-12 09:34:09

    n = n++;
    由于n算符优先级,所以n没有改变
    所以应该直接 ++n;

    回复
    0
  • 取消回复