首页 > 解决方案 > 除非清除间隔在间隔函数内,否则清除间隔不起作用

问题描述

这是一个简单的计数代码,使用 . 从 14 计数到 0 setInterval。3 秒后,我想清除间隔并停止使用savedTimerCounter('stop');. 问题是我无法访问间隔来清除它savedTimerCounter('stop');

为什么以及如何解决这个问题?我错过了什么?

let savedTimer;

function savedTimerCounter(el) {
  //function scope variable 
  switch (el) {
    case 'start':
      timeleft = 14;
      console.log(timeleft);
      savedTimer = setInterval(function() {
        timeleft--;
        console.log(timeleft);
        if (timeleft <= 0) {
          clearInterval(savedTimer);
          console.log("done");
          return;
        }
      }, 1000);
      break;
    case 'stop':
      clearInterval(savedTimer);
      break;
  }
}

//Start counting 
savedTimerCounter('start');

//Stop counting that dosn't work!
setTimeout(function() {
  savedTimerCounter('stop');
}, 3000)

如果你把 let savedTimer;函数的外部(为什么?)代码工作,但创建全局变量是一种不好的做法,我想在这里提示......

标签: javascript

解决方案


你的问题是变量的范围,让我们举个例子:

function doSomething(action) {
  let timer;
  console.log(timer) // will be always undefined;
  // now I do something
  switch (action) {
    case 'start':
      {
        timer = 'start';
        break;
      }
    case 'end':
      {
        timer = 'end'
        break;
      }
  }

  console.log(timer) // will be always the case that enters.
}

doSomething('start'); // this is one function call
console.log('-----------');
doSomething('end'); // this is another function call

如您所见,您正在对同一个函数进行 2 次调用,但它们没有使用相同的变量。您在内部定义的每个变量都是不同的。

您可以查看这篇文章JavaScript 中变量的范围是什么?这将帮助您了解您的问题。


推荐阅读