練炭ブログ

萌え壁紙、Irvine、DMonkey、Proxomitron などの情報を扱ってます。

DMonkey: オブジェクト内関数からプロパティに this なしでアクセスできる

コメントなし»

オブジェクトのプロパティに代入した関数を呼び出すと、関数内から 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 でも未定義エラーになります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です