末尾呼び出しの除去
tail call elimination
1つの関数においてはそれほどありがたみがないが、対象が再帰関数だと大きな効能が得られる
このページでは再帰関数であることは前提しないものとして記述する
jsconst f = () => {
...
return g();
}
f
の返り値は、 g
の返り値である
スタックフレームを積まずに
g
に移行し、
g
の
リターンアドレスは、
f
のものを引き継ぐ
普通ならここで g
用のスタックフレームを作るが、これを作らないことを「末尾呼び出しの除去」と呼ぶ
たすかった


コールスタックの具体例もあってわかりやすい