Imaginantia

思ったことを書きます

クロージャの実装

const f = _=>{
  let a = 0;
  return _=>a++;
};
const b = f();
const c = f();
b();
c();

bc は異なる a を参照する。これらは実装的に「_=>a++;」と「a を持っている環境」から成っている。はず。あとprototype。

で、これをコンパイル言語で「挙動を再解釈」した場合、b c には何が必要だろうか。 「aのアドレス」だけで十分である。実際に実行すべき関数は(今回は)明らかに決定している。

だが型にはその情報は含まれていないので [b,c,_=>_] などの場合は「実行すべき関数」を保存する必要がでてくる。 だが、逆に言えば実行すべき関数を保存する必要があるのは参照の曖昧性があるときだけである。

恐らくこれは a 側にも言える。