setTimeoutで実行した関数でthisを使う

以下のクラスCのメソッドfでは、setTimeoutでメソッドmを実行する。
このときメソッドmのthisはクラスCではないため、undefinedを出力する。

メソッドmでnameフィールドの値を表示するにはどうすればいいか。

class C {
  constructor() { this.name = 'class C'; }
  f() { setTimeout(this.m, 100); }
  m() { console.log(this.name); }
}
(new C).f(); //=> undefined

アロー関数を使う

アロー関数を使えばthisが変わらない。

class D {
  constructor() { this.name = 'class D'; }
  f() { setTimeout(() => { this.m(); }, 100); }
  m() { console.log(this.name); }
}
(new D).f(); //=> class D

setTimeoutの引数にthisを渡す方法

メソッドmに引数でthisを渡す。

class E {
  constructor() { this.name = 'class E'; }
  f() { setTimeout(this.m, 100, this); }
  m(self) { console.log(self.name); }
}
(new E).f(); //=> class E

bindメソッドを使う方法

bindメソッドでthisを指定する。

class F {
  constructor() { this.name = 'class F'; }
  f() { setTimeout(this.m.bind(this), 100); }
  m() { console.log(this.name); }
}
(new F).f(); //=> class F

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください