オブジェクトのプロパティに代入した関数を呼び出すと、関数内から this を付けずにオブジェクト内のプロパティを読み書きできてしまいます。
var o1 = { a: 'b', f: function () { alert (a); } };
o1.f ();
var o2 = { a: 'b' };
o2.f = function () { alert (a); },
o2.f ();
JavaScript ではいずれも未定義エラーになりますが、DMonkey では 'b' が表示されます。
(2番目の例から、クロージャとして動作しているのではなく this なしでオブジェクト内のプロパティにアクセスしていることが分かります。)
例えば
var Util = {
sleep: function (ms) {
println ('Zzz...');
sleep (ms); // Global.sleep を呼ぶつもり
}
};
Util.sleep (1);
のように書くと、sleep ()
で Util.sleep
が再帰呼び出しされてしまいスタックオーバーフローのエラーになります。
(Irvine で実行すると強制終了するので注意して下さい)。
この場合は Global.sleep ()
と書けば期待通りの動作になります。
なお、冒頭のコードの関数呼び出し部分を o1 ['f'] ();
や o2 ['f'] ();
に変えると、インスタンス['メソッド名']() で this が Global になる挙動の影響により、DMonkey でも未定義エラーになります。