一旦超时执行,清除或重新分配分配给 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 的变量用于其他用途,例如存储某些状态(是定时器激活?),那么当它 运行 或被清除时将其设置为一些不同的值是有意义的。
变量timer1
,timer2
只包含定时器的引用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
有时在 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 tonull
?
没有。没有理由这样做。该变量包含 timer/interval 的整数 ID,而不是函数;它没有任何东西。
当然,没有更多理由从超时回调本身调用 clearTimeout
,因为届时超时已经过期。
You'll notice in my example timer1 executes 2 logs, whereas timer2 does not.
只需删除对 id 的 if
测试,两者将一样有效。当你清除timer/interval时,你通常知道你做了什么。
如果,并且仅当,您将包含 id 的变量用于其他用途,例如存储某些状态(是定时器激活?),那么当它 运行 或被清除时将其设置为一些不同的值是有意义的。
变量timer1
,timer2
只包含定时器的引用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