簡単に言うと
こう書くのではなく↓
function countDown(num) {
if(num > 0) {
console.log(num)
countDown(num - 1) // <-- 再帰🙋♂️
} else {
console.log("0になったよ!")
}
}
こう書いてね↓👍
function countDown(num) {
//「Base Case」または「Exit」と呼ばれているよ↓
if(num <= 0) {
console.log("0になったよ!")
return
}
console.log(num)
countDown(num - 1) // <-- 再帰🙋♀️
}
運が良ければ、作動スピードが上がるよ!
何でそうするの?
ブラウザには、再帰できる数に制限があるから、一定の量を超えてしまうとあの有名な「スタック・オーバーフロー」になっちゃう。(処理できずにエラーを飛ばすの)
でも、再帰の部分のを関数の最後に書いておくと、いくつかのブラウザは勝手に「最適化」してくれて、ほぼ無制限に再帰できる。
そして、スピードもぐんと上がる。
見た目も分かりやすいし、いいこと尽くし。
具体的な原理は?
結構ディープな内容なので、エリート君はこちらを参照(英語):
https://exploringjs.com/es6/ch_tail-calls.html
要するに(日本語で):
通常の再帰演算ではなく、goto(次)みたいないな感じにできるから、無制限に呼び出せてスピードも早くなる。
オタクっぽいあなたにも
ES2015(ES6)の仕様書にTCE(Tail Call Elimination)が選定されて、その後色々あってブラウザに採用されたり採用されなかったり。結局今その機能が動いているのはSafariだけなんだけど。