这是一种更符合 JS 设计方式的方法(作为那些仍然不知道的人的函数式语言)。与其依赖全局变量,不如使用闭包:
$("#knap").click(function start()//named callback to bind && unbind:
{
$(this).unbind('click');//no need to start when started
$("#reset").unbind('click').click((function(timer)
{//timer is in scope thanks to closure
return function()
{//resets timer
clearInterval(timer);
timer = null;
$('#knap').click(start);//bind the start again
//alternatively, you could change the start button to a reset button on click and vice versa
}
})(setInterval((function(sec)
{
return function()
{
$('#timer').text(sec--);
if (sec === -1)
{
$('#reset').click();//stops interval
$('#reset').unbind('click');//no more need for the event
alert('done');
}//here's the interval counter: 15, passed as argument to closure
})(15),1000)));//set interval returns timer id, passed as argument to closure
});
现在我承认这是相当混乱的(并且未经测试)但是这样重置事件仅在必要时可用,并且您没有使用任何全局变量。但至关重要的是,这就是 JS 的强大之处:作为第一类对象的函数,将它们作为参数和返回值传递......只是函数疯狂:)
我也设置了一个工作Fiddle