setTimeout()とsetInterval()

タイマーで呼ばれるコールバック関数はグローバルスコープで実行される

 var Foo = function () {
   this.num = 999;
   this.showNum = function () {
     alert(this.num);
   }
   this.showNumLater = function () {
     setTimeout(this.showNum, 1000);
   }
 };
 
 var foo = new Foo;
 foo.showNum();      // => 999
 foo.showNumLater(); // => Undefined

showNumLater()から呼ばれるコールバック関数であるshowNum()はグローバルスコープで実行される。よって、this.numはグローバルオブジェクトを指す。this.numはFoo.numではない。

すべてのタイマーをクリアする

 for(var i = 1; i < 1000; i++) {
     clearTimeout(i);
 }

この方法でもタイマーIDに漏れがある事もあるらしい。

タイマーで呼ばれるコールバック関数が引数を受け取る場合、無名関数でラップする

 function foo(a,b) { console.log(a + "," + b); }
  
 setTimeout("foo(1,2)", 500);            
 setTimeout(function(){ foo(1,2) }, 500);

前者のように"foo(1,2)"のような文字列を渡してeval()する事も出来るが、後者のように無名関数を使う方がベタープラクティス。

以下の例ではグローバルのfoo()が呼ばれる。

 function foo() { console.log("1"); }
 function bar() { 
   function foo() { console.log("2"); }; 
   setTimeout("foo()", 500);
 } 
 bar(); // => "1

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS