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 だけではないので注意しようね。
