var num = 0;
var max = 10;
var intervalNumber = null;function incrementNumber() {
return function() {
num++;
alert("No");

setTimeout(arguments.callee, 500);
if (num == max) {
clearTimeout(intervalNumber);
alert("Done");
}
}
}var interval = incrementNumber();
intervalNumber = setTimeout(interval, 500);
为什么弹出了Done窗口后还继续弹出No?不是应该Done后就没有了吗?

解决方案 »

  1.   

    var num = 0;
    var max = 10;
    var intervalNumber = null;function incrementNumber() {
        return function() {
            num++;
            alert("No");
            s2=setTimeout(arguments.callee, 500);//你这个调用自身的定时器并没有清除掉
            if (num == max) {
                clearTimeout(s2);//清除它
                clearTimeout(intervalNumber);
                alert("Done");
            }
        }
    }var interval = incrementNumber();
    intervalNumber = setTimeout(interval, 500);
      

  2.   


    那为什么setInterval又可以呢?
    var num = 0;
    var max = 10;
    var intervalNumber = null;function incrementNumber() {
    return function() {
    num++;
    alert("No");

    if (num == max) {
    clearInterval(intervalNumber);
    alert("Done");
    }
    }
    }var interval = incrementNumber();
    intervalNumber = setInterval(interval, 500);
      

  3.   

    这算什么问题??你之前是两个定时器,现在是一个定时器,你当然清除一次就够了你上面的函数中,比之前的少了:setTimeout(arguments.callee, 500);这个定时器呀我在1楼已经说得很明白了,你如果想要使用setTimeout。应该是var num = 0;
    var max = 10;
    var intervalNumber = null;function incrementNumber() {
        return function() {
            num++;
            alert("No");
            //你之前将setTimeout(arguments.callee, 500);放在这里,不管下面的num==max条件成立与否,都已经执行了呀。你自己仔细想想就清楚了
            if (num == max) {
                alert("Done");
            }else{
                setTimeout(arguments.callee, 500);//你这个调用自身的定时器并没有清除掉
            }
        }
    };
    var interval = incrementNumber();
    intervalNumber = setTimeout(interval, 500);
      

  4.   

     setTimeout(arguments.callee, 500);
            if (num == max) {
                clearTimeout(intervalNumber); // 并没有清除前面的 setTimeout(arguments.callee, 500);清除的是 intervalNumber
                alert("Done");
            }