我正在努力理解以下代码:
function setIdle(cb, seconds) {
var timer;
var interval = seconds * 1000;
function refresh() {
clearInterval(timer);
timer = setTimeout(cb, interval);
};
$(document).on('keypress, click', refresh);
refresh();
}
setIdle(function() {
location.href = location.href;
}, 5);
setIdle
接受两个自变量。在其函数内部,它有一个函数refresh
,用于清除Timeout
函数上的计时器。现在,每当事件发生时(click
、keypress
),都会调用refresh()
。
然后最后调用这个函数,传入另一个函数和int值(5
),后者稍后将是计时器的秒数。在稍后通过cb
表示的另一个函数中,页面将被刷新(location.href = location.href;
)。
这会导致每5秒自动刷新一次页面。
所以现在我不明白我是否添加了一个额外的功能:
setIdle(function() {
console.log('hi');
}, 1);
为什么第二个函数只调用一次,而不是像另一个一样每秒调用一次?
setIdle
不会每5秒运行一次回调函数。它运行一次,在您调用setIdle
后5秒,如果您键入或单击某个内容,超时将再次被推迟。所以它只运行一次,当你空闲5秒时。
页面每5秒刷新一次的原因是回调函数重新加载页面,并且重新加载页面会再次运行页面中的所有Javascript,从而再次调用setIdle()
。
但是第二次使用setIdle
不会重新加载页面,所以它只记录hi
一次。
如果你想每N秒重复做一件事,请使用setInterval
而不是setTimeout
。
BTW、clearInterval
应该是clearTimeout
。在大多数浏览器中,它们目前是可互换的,但不能保证。请参阅clearTimeout和clearInterval是否相同?