インスタンス内で setTimeout/setInterval を使った処理の繰り返し

インスタンス内で処理の繰り返しや時限実行をしたいと思っても、setTimeout/setInterval は引数にローカル変数を使えないので、一筋縄では行かない。
前段階として、内部で自分自身(の参照)をグローバル変数へ代入しておくとよい。

var pool = new Array(); //グローバル変数を用意。new Object();でも可

function func2(){
 pool[arguments[0]] = this;
  //自分自身の参照をグローバルスコープへ。arguments[0]にはユニークな値を与えること
 this.ID = arguments[0];
 this.count = 0;
 function _countUp(){ //実際に行う処理
  if (this.count >= 4) { clearInterval(this.loop) }
  alert(this.ID + ': ' + this.count++);
 }
 func2.prototype.countUp = _countUp;

 function _startCount(){ //時限実行処理
  this.loop = setInterval("pool['" + this.ID + "'].countUp();",2000);
 }
 func2.prototype.startCount = _startCount;
}

var obj = new func2('A');
var obj2 = new func2('B');
var obj3 = new func2('C');
obj.startCount();
obj2.startCount();
obj3.startCount();

Leave a Reply