[実験]JavaScriptの神秘

このプログラムの 1-4の出力結果をそれぞれ答えなさい

function cl() {}
cl.prototype.exe =function() {
   alert(this.val);
}
cl.prototype.test=function() {
  a=new cl();
  a.val="a";
  a.exe();         // 1
  alert(this.val); // 2
  var c=a.exe;
  c();             // 3
  (a.exe)();       // 4
}
val="t";
b=new cl();
b.val="b";
b.test();

答えは,a,b,t,a
なによりショッキングだったのは3 と 4の結果がちがうことだ.

自分が思っていたのは,

  • this は世界に1個しかないレジスタである.
  • a.exe() という書き方をされたときには, this=a として exeをよぶ
  • c=a.exe; c(); の場合は,cはthisを変えずに呼ぶ.

しかし,最後の仮説はちがうみたい...ってc(); の結果が"t"ってどういう仕組みだろう..