うーん、気付いてなかったわ。
javascript の setInterval なんだけどさ、ほかの言語とかプラットフォームの似た API と違って、コールバック内でタイマー ID を識別出来ないんだね。つまり呼ばれた当人が自殺出来ない。これは弱るなぁ。
ので代替案:
1 function Interval(callback, delay, user_param) {
2 this._timerid = setInterval(callback, delay, user_param);
3 this.clear = function() {
4 clearInterval(this._timerid);
5 };
6 }
このような使い方を想定してる:
1 var timers = {};
2 tk = "Specified key";
3 timers[tk] = new Interval(
4 function(user_param) { // 今の場合 user_param には tk が渡る
5 console.log(user_param);
6 timers[user_param].clear();
7 delete timers[user_param];
8 }, 1000, tk);
9 //timers[tk].clear();
無論「一回呼ばれるだけで自殺」するなら setTimeout を使えばいいのでこれはあくまでも例。普通は何か条件を満たしたら殺すんだろう。
IE9 がダメ…、についてだが…、うーん、「Windows 7 ですら IE11」だよ? 今更気にするの? てことで普通はいいんではないかと思う。ないとは言わないよ、レガシーな基幹系業務が「インターネットから隔離された環境で」延命してるなんてありがちだから。そういう場合は user_param を諦めたバージョンでも「まぁまぁマシ」と思うよ。
追記:
reset もあると嬉しいよね:
1 function Interval(callback, delay, user_param) {
2 this._timerid = setInterval(callback, delay, user_param);
3 this.clear = function() {
4 if (this._timerid !== null) {
5 clearInterval(this._timerid);
6 }
7 this._timerid = null;
8 };
9 this.reset = function(_callback, _delay, _user_param) {
10 this.clear();
11 this._timerid = setInterval(_callback, _delay, _user_param);
12 };
13 }