JavaScriptのthisの扱いが難しすぎる件

[再々追記]
(o.f = o.f)()の結果は右辺値・左辺値というルールで説明できるようです。コメント欄参照のこと。
[/再々追記]
[再追記]

これの解釈はどうすれば…。
[/再追記]
[追記]

([o.f][0])() -> o.f は ([o.f, "a"][0])() とすると分かりやすいが、単にレシーバがArrayになっているだけらしい。
また (o.f)()と(tmp = o.f)の違いはブコメで指摘されているとおり、 o.f が (C++的な意味での)参照を返すと考えると理解できる。
[/追記]
だれかこの現象を説明できる人はいませんか。私には難しすぎます。

In node:

#!/usr/bin/env node
var o = {}, tmp;

o.f = function() { console.log(this.toString()) };

o.toString = function() { return "o" };
o.f.toString = function() { return "o.f" };
(function(){ return this })().toString = function() {
    return "global";
};


o.f(); // o
(o.f)(); // o

([o.f][0])(); // o.f
(new Array(o.f)[0])(); // o.f
([tmp  = o.f][0])(); // o.f

(tmp = o.f)(); // global
(function(){ return o.f })()(); // global

({x: o.f, toString: function(){ return "t" }}.x)(); // t