遞迴迴圈

尾呼叫優化可以安全地實現遞迴迴圈,而無需考慮呼叫堆疊溢位或增長的幀堆疊的開銷。

function indexOf(array, predicate, i = 0) {
    if (0 <= i && i < array.length) {
        if (predicate(array[i])) {  return i; }
        return indexOf(array, predicate, i + 1); // the tail call
    }
}
indexOf([1,2,3,4,5,6,7], x => x === 5); // returns index of 5 which is 4