前回の続き。
仕様書の和訳を見ながらしばらく悩んでいた。
function C(){ this.str = 'C' } function D(){ this.str = 'D' } C.prototype.f = function(){ alert(this.str) } D.prototype.f = function(){ alert(this.str) } D.prototype.foo = function(){ var c = new C(); c.f(); var bar = c.f; bar(); this.hoge = c.f; this.hoge(); } var str = 'global'; var d = new D(); d.foo();
11.2.3 関数呼出し によると
something()
という関数呼出しにおいては、this は GetBase(something) になる(GetBase は本当の関数ではなく、仕様の説明上の表記。 8.7 Reference 型 のところに書いてある)。 c.f() の場合は GetBase(c.f) は c だし、this.hoge() の場合は GetBase(this.hoge) は this (つまり d) になる。 だから、c.f() のときは 'C' が出るし、this.hoge() のときは 'D' が出る。
よく分からないのは、bar() に 'global' になること。
var で変数を定義したときにそれの GetBase が何になるかが仕様書を読んでも分からない。