forEachのthis

結論

  • forEachの中のthisはグローバルオブジェクトを参照する.
  • ローカルオブジェクトのthisを参照するためには,forEachの第2引数にthisを指定する.
  • 実行したのはGoogle Apps Script.

同じクラスのメソッドを呼ぶ際に要注意

  1. メソッドbar01bat02を持つオブジェクトFooを定義.
  2. メソッドbar01の中でbar02を呼ぶ.
  3. エラー「関数bar01が見つかりません」発生.
function fooTest(){
  var foo=new Foo();
  foo.bar01();
}

function Foo() {}

Foo.prototype={
  bar01: function(){
    [10, 20, 30].forEach(function(value){this.bar02(value);});
    // TypeError: オブジェクト [object Object] で関数 bar02 が見つかりません。
  },
  bar02: function(value){
    Logger.log(value);
  },
}

第2引数を指定しないと,this.bar02がクラスFooのメソッドbar02ではなく,グローバルオブジェクトObjectのメソッドbar02を参照する.グローバルオブジェクトにはメソッドbar02がないので,エラーになる.

第2引数にthisを指定

function foo2Test(){
  var foo2=new Foo2();
  foo2.bar01();
}

function Foo2() {}

Foo2.prototype={
  bar01: function(){
    [10, 20, 30].forEach(function(value){this.bar02(value);}, this);
    // 第2引数にthis(Foo2のインスタンス)を指定すると、forEachの中のthisは第2引数に指定したFoo2のインスタンスになる → Foo2.bar02を呼べる。
  },
  bar02: function(value){
    Logger.log(value);
  },
}

forEachではなくforを使う

forEachではなくforを使えば,thisを気にする必要はない.

function foo3Test(){
  var foo3=new Foo3();
  foo3.bar01();
}

function Foo3() {}

Foo3.prototype={
  bar01: function(){
    var arr=[10, 20, 30];
    for(var value in arr){  // forを使う
      this.bar02(arr[value]);  
    }
  },
  bar02: function(value){
    Logger.log(value);
  },
}