再帰がどのぐらいでコールスタックを使い果たすのか試していたら、Firefoxの謎なふるまいを発見したのでご報告。
function f0(n) {
try{
return f0(n+1);
}catch(e){
return n;
}
}
f0(0);
/*
10194
*/
function f1(n) {
try{
return Object.assign(f1)(n+1);
}catch(e){
return n;
}
}
f1(0);
/*
25684
*/
Object.assign()
でソースオブジェクトを指定していないので、元の関数をそのまま使ってるだけのはずなのに、スタックオーバーフローに強くなってる。
「もしかして余分な処理を挟むことによってウェイトが入ってその分メモリが回収されてる?」と思って、ループを挟むなどしてみたけど、あまり関係がないみたいだった。謎。
ちなみに、Chromeでは再現しなかった。
なお、思い出したようにFirefox121で試したところ、再現しなかった。