◆ フィボナッチ数計算で 1 回目だけ速くて以降は遅い
  ◆ 倍近くも差がある
◆ 普段は 1 回目だけ遅くて以降が速いので逆
◆ Firefox だと普通に 1 回目だけわずかに遅くて後が少し速い

Chrome ではよくわからない最適化の結果で 2 回目や 3 回目以降が高速になることが多いです
しかし 珍しく 1 回目が速くてそれ以降が遅いケースに出会いました

特に変わった処理でもなくただのフィボナッチ数の計算です
実際のコードは下に載せています
1 つめは 0 から 37 までを計算する処理です
2 つめは 38 の計算を 3 回繰り返す処理です

普段は for 文で何万回実行みたいな同じ繰り返しなので 1 つ目の例で珍しい結果だったのは内部で繰り返しじゃないからかなと思って 2 つ目も試してみましたが変わらず 1 回目だけ速い結果でした
一応 20 の計算を 100 回でもやりました同じような結果でした

私の環境だと こういう結果でした

1 回目2 回目以降
1 つ目1 秒くらい 2 秒くらい
2 つ目1.8 秒くらい 3.3 秒くらい

ちょっと遅い程度ではなく 倍近く遅くなってます

Chrome 80.0.3987.116 で試しました
Node.js 13.9 も同じような結果でした
Firefox 72.0 では逆で 2 回目以降がわずかに速いです

<!doctype html>

<h1 id="msg">Measuring...</h1>

<script>
const f = () => {
console.time("1")
const fi = x => x < 2 ? x : fi(x - 2) + fi(x - 1)
for(let i = 0; i < 38; i++) fi(i)
console.timeEnd("1")
}

f()
f()
f()

msg.textContent = "Please see console (F12 key)"
</script>

<!doctype html>

<h1 id="msg">Measuring...</h1>

<script>
const f = () => {
console.time("1")
const fi = x => x < 2 ? x : fi(x - 2) + fi(x - 1)
for(let i = 0; i < 3; i++) fi(38)
console.timeEnd("1")
}

f()
f()
f()

msg.textContent = "Please see console (F12 key)"
</script>

追記

フィボナッチ数計算の関数 fi の場所を f 関数の外に出すと 2 回目の速度が落ちなくなりました
console.time の上で f 関数の内側だと効果がなかったので 関数定義自体に時間がかかってるわけではないようです

関数内関数は毎回関数を作る分遅くて 外で作ったのを使い回す方が速いのですが 関数作成のコストはほぼないのであまり気にしてません
特に 2 つ目の例は 3 回しか作ってないわけですし
Chrome (V8) の最適化の都合なので これに合わせて関数内関数を避けるべきかとなると難しいところです

速度関係なく作りの面で言えば 親側の関数のローカルスコープの変数を参照する必要ないなら外にあっても問題はないです
ただ他で使わないその関数専用のものを外に出すと余計なものが多くなってわかりづらさも増すのでスコープは小さくするほうが好みです
作った関数から見ると内側にあるほど親やその親などネストしたスコープ全部を見れるので広いといえば広いですけど