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