递归循环

尾调用优化可以安全地实现递归循环,而无需考虑调用堆栈溢出或增长的帧堆栈的开销。

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