Javascript clearTimeout()不起作用

时间:2017-05-12 18:12:07

标签: javascript jscript

当我尝试clearTimeout()时,超时才会继续。 代码:

function autoSlides(x) {
    var timeOut;
    if (x == 1) {
        plusSlides(1);
        document.getElementById("switch").onclick = function () { autoSlides(2) };
        timeOut = setTimeout(function () { autoSlides(1) }, 4000);
    } else if (x == 2) {
        clearTimeout(timeOut);
        document.getElementById("switch").onclick = function () { autoSlides(1) };
    }
}

3 个答案:

答案 0 :(得分:3)

那是因为你在函数内部声明了timeOut。这意味着您没有使用您之前保存的相同值。

function autoSlides(x) {
  var timeOut; // Initialized to `undefined`
  if (x === 1) {
    timeOut = setTimeout(function() {
      console.log('Look, the timeout finished');
    }, 1000);
  } else if (x === 2) {
    // Remember: this is a new timeout variable
    // So this really means `clearTimeout(undefined)`
    clearTimeout(timeOut);
  }
}

autoSlides(1);
autoSlides(2);

您需要做的是将超时ID保存在函数之外的某个位置。

var timeOut; // Won't be reset every time the function is called
function autoSlides(x) {
  if (x === 1) {
    timeOut = setTimeout(function() {
      console.log('Look, the timeout never finishes');
    }, 1000);
  } else if (x === 2) {
    // The value was saved last time
    clearTimeout(timeOut);
    console.log('cleared the timeout');
  }
}

autoSlides(1);
autoSlides(2);

答案 1 :(得分:1)

timeOutautoSlides的本地变量。

autoSlides有一个if语句,所以它会:

  • 将值分配给timeOut
  • 尝试使用timeOut清除超时

由于它从不同时执行这两项操作,因此timeOut的值在第二种情况下始终为undefined

如果您希望在多次调用autoSlides函数时重复使用该变量,则需要将其声明为之外,而不是在autoSlides内。

答案 2 :(得分:0)

您可以将“超时”分配给功能范围之外。如果您使用客户端javascript:

,一种选择是将其附加到全局“窗口”对象
window.timeOut = setTimeout(function () { autoSlides(1) }, 4000);

clearTimeout(window.timeOut);