これは、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の力のあるところです。ファーストクラスのオブジェクトとして機能し、引数と戻り値としてそれらを渡します...関数に夢中になるだけです:)
私も動作するフィドルを設定しました