一旦超时执行,清除或重新分配分配给 setTimeout return 值的变量是否有任何技术要点?

Is there any technical point in clearing or reassigning variables assigned to a setTimeout return value once the timeout executes?

有时在 setTimeout 函数中,您希望在执行操作之前确保它不存在。

执行 setTimeout 后,clearing/re-assigning 变量中是否有包含超时 ID 的值? setInterval 呢?

您会注意到在我的示例中 timer1 执行了 2 个日志,而 timer2 没有。

function renderUtility(name, value) {
  var el = document.createElement('p');
  el.textContent = name + ": " + value
  document.body.appendChild(el);
}

var timer1 = setTimeout(function() {
  clearTimeout(timer1);
  renderUtility('timer1', timer1);
  if (timer1) renderUtility('timer1', "I exist");
}, 1000);

var timer2 = setTimeout(function() {
  clearTimeout(timer2);
  timer2 = null;
  renderUtility('timer2', timer2);
  if (timer2) renderUtility('timer2', "I exist");
}, 1000);

When clearing a setTimeout/ setInterval, should the variable containing this function also be set to null?

没有。没有理由这样做。该变量包含 timer/interval 的整数 ID,而不是函数;它没有任何东西。

当然,没有更多理由从超时回调本身调用 clearTimeout,因为届时超时已经过期。

You'll notice in my example timer1 executes 2 logs, whereas timer2 does not.

只需删除对 id 的 if 测试,两者将一样有效。当你清除timer/interval时,你通常知道你做了什么。

如果,并且仅当,您将包含 id 的变量用于其他用途,例如存储某些状态(是定时器激活?),那么当它 运行 或被清除时将其设置为一些不同的值是有意义的。

变量timer1timer2只包含定时器的引用id,当你clearTimeout时,超时功能被清除但id仍然存在于变量中。您可以执行以下操作

var timer2 = setTimeout(function() {
  renderUtility('timer2', timer2);
  timer2 = null;    
  if (timer2) renderUtility('timer2', "I exist");
 }, 1000);

这只会打印一次timer2。请注意,不需要 clearTimeout,因为 setTimeout 只执行一次。尽管要检查函数是否已经执行,我们可以在定时器函数之外保留另一个计数器变量。喜欢关注

<button onclick="startCount()">Start count!</button>
<input type="text" id="txt">
<button onclick="stopCount()">Stop count!</button>

<script>
var c = 0;
var t;
var timer_is_on = 0;

function timedCount() {
    document.getElementById("txt").value = c;
    c = c + 1;
    t = setTimeout(function(){timedCount()}, 1000);
}

function startCount() {
    if (!timer_is_on) {
        timer_is_on = 1;
        timedCount();
    }
}

function stopCount() {
    clearTimeout(t);
    timer_is_on = 0;
}
</script>

更多详情请查看http://www.w3schools.com/jsref/met_win_cleartimeout.asp