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

Javascript 一旦超时执行,清除或重新分配分配给setTimeout返回值的变量是否有任何技术要点?,javascript,settimeout,setinterval,clearinterval,cleartimeout,Javascript,Settimeout,Setinterval,Clearinterval,Cleartimeout,有时在setTimeout函数中,您希望在执行操作之前确保它不存在 执行setTimeout时,清除/重新分配包含超时ID的变量时是否有任何值?setInterval怎么样 在我的示例中,您会注意到timer1执行2个日志,而timer2不执行 函数渲染性(名称、值){ var el=document.createElement('p'); el.textContent=name+“:”+值 文件.正文.附件(el); } var timer1=setTimeout(函数(){ 清除超时(计时

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

执行
setTimeout
时,清除/重新分配包含超时ID的变量时是否有任何值?
setInterval
怎么样

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

函数渲染性(名称、值){
var el=document.createElement('p');
el.textContent=name+“:”+值
文件.正文.附件(el);
}
var timer1=setTimeout(函数(){
清除超时(计时器1);
可渲染性(“计时器1”,计时器1);
如果(timer1)可渲染性(“timer1”,“我存在”);
}, 1000);
var timer2=setTimeout(函数(){
清除超时(timer2);
timer2=null;
可渲染性(“timer2”,timer2);
如果(timer2)可渲染性(“timer2”,“我存在”);
}, 1000);
清除
setTimeout
/
setInterval
时,包含此函数的变量是否也应设置为
null

不,没有理由这么做。变量包含计时器/间隔的整数id,而不是函数;它什么都抓不住

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

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

只需删除id的
if
测试,两者的工作原理相同。当你清除计时器/间隔时,你通常知道你做了什么


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

变量
timer1
timer2
仅包含计时器的参考id,当您
clearTimeout
时,timeout函数被清除,但id仍然存在于变量中。您可以执行以下操作之一

var timer2 = setTimeout(function() {
  renderUtility('timer2', timer2);
  timer2 = null;    
  if (timer2) renderUtility('timer2', "I exist");
 }, 1000);
<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>
这将只打印计时器2一次。注意,
clearTimeout
不需要,因为
setTimeout
只执行一次。尽管要检查函数是否已经执行,我们可以在计时器函数之外保留另一个计数器变量。像下面

var timer2 = setTimeout(function() {
  renderUtility('timer2', timer2);
  timer2 = null;    
  if (timer2) renderUtility('timer2', "I exist");
 }, 1000);
<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>
开始计数!
停止计数!
var c=0;
变量t;
var定时器_为_on=0;
函数timedCount(){
document.getElementById(“txt”).value=c;
c=c+1;
t=setTimeout(函数(){timedCount()},1000);
}
函数startCount(){
如果(!计时器打开){
定时器_为_开=1;
timedCount();
}
}
函数stopCount(){
清除超时(t);
定时器_为_开=0;
}

有关签出的更多详细信息,您的意思是“已分配”,而不是“已定义”。考虑到
setTimeout
返回的所有内容都是一个整数“句柄”(请参阅:),在调用clearTimeout后将其设置为null实际上没有多大用处。也就是说,我投票决定关闭,因为这主要是基于观点的。请注意,setTimeout与setInterval不同,只触发一次。在clearTimeout被触发后调用它是没有必要的。如果您希望使用它来测试计时器是否正在运行,请在清除或启动计时器时将其设置为零(或其他falsy值)。