訂正?関数コンテクストについて
以前A.a() はコンテクストをAとしてAの中で"a"と名前のつけられたclosureを探して実行すると書いた。だとするとこれは期待通りに動かないのか?
class Base { function set(v) { value = v; } value = 0; } class Deriv extends Base { // ↓ この部分でクラス定義そのものがコンテクストになってしまう? function set(v) { Base.set(v); } } A <- Deriv(); A.set(1);
だがこれは上手くいく。Aインスタンス内のvalueがBaseクラスのメンバ関数を用いて設定される。どうなっているんだろう。
実際にはスクリプトがclosureへコンパイルされる時点ではコンテクストにクラス定義を設定するようになっている。vmがこのclosureを実行する際に、コンテクストがクラス定義だった場合、これを元々実行しているclosureのコンテクストへ置き換えている。単純にそうしているだけなのだ。なのでこういうおかしなコードも通る。
class Base { function set(v) { value = v; } } value <- 0; Base.set(1);