devSoyoung / STUDY

✏️ 공부한 내용 정리, 주제에 따라 분류
4 stars 1 forks source link

[ES6] Tail Call 최적화 #27

Open devSoyoung opened 4 years ago

devSoyoung commented 4 years ago

ES6 이전

ES6 이후

  1. Tail Call은 현재 스택 프레임 변수에 액세스 할 필요가 없음(클로저 아님을 뜻함)
  2. Tail Call 수행하는 함수는 Tail Call이 리턴한 후 더 이상 수행할 작업이 없음
  3. Tail Call의 결과는 함수 값으로 반환됨
// 최적화 됨
function doSomething() {
    return doSomethingElse();
}

// 최적화 안됨
function doSomething2() {
    doSomethingElse();
}

// 최적화 안됨 : 복귀 후 추가 작업하는 경우
function doSomething3() {
    return 1 + doSomethingElse();
}

// 최적화 안됨
function doSomething4() {
  var result = doSomethingElse();
  return result;
}

Tail Call 최적화를 활용하는 방법

재귀 호출 최적화 : 팩토리얼에서 마지막 곱셈을 파라미터로 전달하면 성능 향상을 제공함

// before
function factorial(n) {
    if (n <= 1) {
        return 1;
    } else {
        // not optimized - must multiply after returning
        return n * factorial(n - 1);
    }
}
// after
function factorial(n, p = 1) {
    if (n <= 1) {
        return 1 * p;
    } else {
        let result = n * p;
        // optimized
        return factorial(n - 1, result);
    }
}

Reference