JavaScriptの挙動は仕様を見ればだいたい書いてある

http://d.hatena.ne.jp/gfx/20120223/1329996834

(o.f=o.f)()はglobalになった
これの解釈はどうすれば…。

こういうのは仕様書見ればだいたい解決する。

http://www.ecmascript.org/docs.php
今回は3rdを参照しましたが5thでも同じであろう。

メソッド呼び出しは11.2.3のFunction callsなので、それを見る。
=> 最初に(o.f=o.f)を評価
  => =を使っているので、11.13.1 Smple Assignmentのルールに従って処理される。
  => LeftHandSideExpression = o.f, AssignmentExpression = o.f
  => この処理の返り値は、GetValue(AssignmentExpression)である。
    => 8.7.1 GetValueは、プロパティの参照から値を取り出す。
  => つまり、単なるfunctionオブジェクトが返る

というわけで、裸の関数を呼んだ時と同じ挙動になる=レシーバはグローバルである

実際のところthisの挙動はそれほど複雑じゃなくて、

  • プロパティの参照(hoge.fugaとかa[b])から直接関数を呼んだときは、this=プロパティの入ってるオブジェクト
  • それ以外のときは、this=グローバル

と解釈しておけば問題ないのでは。そして悩んだら仕様読む。