JavaScript は本当に奇妙な言語です。
#!/usr/bin/gjs const Lang = imports.lang; const TestClass = new Lang.Class({ Name: 'TestClass', _init: function() { this.arr = [12, 34, 56]; this.str = "String"; for (let i=0; i<this.arr.length; i++) { print(this.str); print(this.arr[i]); } this.arr.forEach(function(s) { print(this.str); print(s); }); } }); new TestClass(); /* output String 12 String 34 String 56 undefined 12 undefined 34 undefined 56 */
ループは forEach が解かり易いので多用していたけどコレにハマった。
Gjs はそもそも class が無い JavaScript にアクロバットな対応をしている。
this は C++ の this では無いと気が付くまで半日近く使ってしまった。
JavaScript の this は呼び出し元という意味。
つまり上記では forEach の this は this.arr である。
this.arr.str なんて宣言していないから undefined ということです。
こんな深い階層で this を使おうとした筆者が悪いんだけどさ。
Gjs だけではないので注意しようね。