forEachのthis
結論
forEach
の中のthis
はグローバルオブジェクトを参照する.- ローカルオブジェクトのthisを参照するためには,
forEach
の第2引数にthis
を指定する. - 実行したのはGoogle Apps Script.
同じクラスのメソッドを呼ぶ際に要注意
- メソッド
bar01
とbat02
を持つオブジェクトFoo
を定義. - メソッド
bar01
の中でbar02
を呼ぶ. - エラー「関数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);
},
}