jsのクロージャのキャプチャ範囲
発端
Claude Code (JSで書かれたCLIツール)のメモリ使用量を削減した話
code:js
//before
const f = () => controller.abort();
//after
const f = controller.abort.bind(controller);
一見同じに見えるが、後者がcontrollerだけをキャプチャするのに対し、前者はcontroller以外の変数(今回の例だとthis, init, optionsなど)もまとめてキャプチャしてしまうらしい
まとめ
1. 変数を一個一個キャプチャすると、正確だけど遅い
2. 変数をまとめてキャプチャすると速いが、でかいオブジェクトが混ざっていたときにメモリの使いすぎになる
というトレードオフがある。