2012-02-23
JavaScriptのthisの扱いが難しすぎる件
[再々追記]
(o.f = o.f)()の結果は右辺値・左辺値というルールで説明できるようです。コメント欄参照のこと。
[/再々追記]
[再追記]
(o.f=o.f)()はglobalになった
これの解釈はどうすれば…。
[/再追記]
[追記]
@__gfx__ レシーバがいるならthisはそいつだし、関数コピーして実行したならthisはglobal
2012-02-23 20:40:28 via Echofon to @__gfx__
@__gfx__ これはArrayがレシーバになってて、文字列化されてるからo.fが返ってるだけでしょ
2012-02-23 20:45:31 via Echofon to @__gfx__
([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
コナミ
クリック: 2回
クリック: 2回
トラックバック - http://d.hatena.ne.jp/gfx/20120223/1329996834
リンク元
- 184 http://d.hatena.ne.jp/gnarl/20120224/1330011565
- 106 http://t.co/14o2uQb6
- 102 http://reader.livedoor.com/reader/
- 79 http://t.co/YtFGW7YI
- 50 http://longurl.org
- 47 http://t.co/rMV2aRkG
- 34 http://t.co/VJGCDa7M
- 28 http://bit.ly/yFxrNC
- 27 http://b.hatena.ne.jp/entrylist/it
- 26 http://b.hatena.ne.jp/entry/d.hatena.ne.jp/gfx/20120223/1329996834


