Javascript clearTimeout() 不工作

Javascript clearTimeout() not working

当我尝试 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) };
    }
}

timeOutautoSlides 的局部变量。

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

  • timeOut赋值
  • 尝试使用timeOut清除超时

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

如果您想在多次调用 autoSlides 函数时重复使用该变量,则需要在 外部 而不是 autoSlides 内部声明它。

那是因为您在函数内部声明 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);

您可以将 "timeout" 分配给函数范围之外。一种选择是将它附加到全局 "window" 对象,如果您使用客户端 javascript:

window.timeOut = setTimeout(function () { autoSlides(1) }, 4000);

clearTimeout(window.timeOut);