-1

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

在执行 asetTimeout时,清除/重新分配包含超时 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);

4

2 回答 2

1

清除setTimeout/setInterval时,包含此函数的变量是否也应设置为null

不,没有理由这样做。该变量包含计时器/间隔的整数 id,而不是函数;它不持有任何东西。

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

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

只需删除ifid 的测试,两者都将起作用。当你清除计时器/间隔时,你通常知道你做了什么。

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

于 2016-02-01T01:57:11.703 回答
0

variables 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

于 2016-02-01T02:16:26.410 回答