thisについて考えてみる

thisを意外と何の気なしにつかってるからいろいろ実験。

var hoge = "Global hoge";
function Hoge(){
    this.hoge = "hoge";
}
Hoge.prototype.func = function(){alert(this.hoge);};
var a = new Hoge();
a.func();

実行結果は『hoge』とダイアログがでる。
これは、newしたときに生成されたオブジェクト(インスタンス?)
がthisになるから、aを参照する。
この場合のthis.hogeHoge()コンストラクタで初期化された
a.hogeが出力されているんだろう。
さっきのやつに

  (function(func){func();})(a.func);

を追加してみる。
『Global hoge』とダイアログがでた。
thisの参照がaからグローバル空間に変わったのか?
関数a.func()を渡して匿名関数ないのローカル変数(関数)がになって
匿名関数はグローバル空間で実行される(上にあわせるとグローバル空間にnewされる?)。
だからthisはグローバル空間になるのか?
グローバル空間をオブジェクトとしてみたとすると、グローバル空間コンストラクタで
設定されるって考えればしっくりくるのかな?

function Foo(func){
    this.hoge = "Foo hoge";
    this.func = func;
}
var foo = new Foo(a.func);
foo.func();

とすると、Foo()コンストラクタでnewされたときにFooのプロパティに
なってるからthisはfooになる。
だから『Foo hoge』がダイアログにでる。

うまくまとまらないが、thisはコンストラクタで生成されたオブジェクトを
みにいってるってことになる?