es6 함수 의 끝 호출 최적화 사례 분석
무엇이 꼬리 호출 최적화 입 니까?
꼬리 호출 은 함수 식 프로 그래 밍 의 중요 한 개념 으로 그 자체 가 매우 간단 하 며 한 마디 로 분명하게 말 할 수 있다.즉,특정한 함수 의 마지막 단 계 는 다른 함 수 를 호출 하 는 것 을 말한다.
function f(x) {
return g(x)
}
위의 코드 에서 함수 f 의 마지막 단 계 는 함수 g 를 호출 하 는 것 입 니 다.이것 을 꼬리 호출 이 라 고 합 니 다.아래 세 가지 상황 은 모두 미 호출 에 속 하지 않 는 다.
//
function f(x) {
let y = g(x)
return y
}
//
function f(x) {
return g(x) + 1
}
//
function f(x) {
g(x)
}
꼬리 호출 은 반드시 함수 끝부분 에 나타 나 는 것 이 아니 라 마지막 조작 만 하면 된다.
function f(x) {
if (x > 0) {
return m(x)
}
return n(x);
}
꼬리 호출 이 다른 호출 과 다른 이 유 는 특수 한 호출 위치 에 있다.우 리 는 함수 호출 이 메모리 에'호출 기록'을 형성 하고 호출 프레임 이 라 고도 부 르 며 호출 위치 와 내부 변수 등 정 보 를 저장 한 다 는 것 을 알 고 있다.함수 A 의 내부 에서 함수 B 를 호출 하면 A 의 호출 프레임 위 에 B 의 호출 프레임 이 형성 된다.B 운행 이 끝나 면 결 과 를 A 로 되 돌려 야 B 의 호출 프레임 이 사라 집 니 다.함수 B 내부 에서 함수 C 를 호출 하면 C 의 호출 프레임 이 하나 더 있 습 니 다.모든 호출 프레임 이 호출 스 택 을 만 들 었 습 니 다.
꼬리 호출 은 함수 의 마지막 작업 이기 때문에 외층 함수 의 호출 프레임 을 보류 할 필요 가 없습니다.호출 위치,내부 변수 등 정 보 는 더 이상 사용 되 지 않 기 때문에 내층 함수 의 호출 프레임 을 직접 사용 하여 외층 함수 의 호출 프레임 을 대체 하면 됩 니 다.
function f() {
let m = 1;
let n = 2;
return g(m + n);
}
f();
//
function f() {
return g(3);
}
f();
//
g(3);
위의 코드 에서 함수 g 가 꼬리 호출 이 아니라면 함수 f 는 내부 변수 m 와 n 의 값,g 의 호출 위치 등 정 보 를 저장 해 야 합 니 다.그러나 g 를 호출 한 후에 함수 f 가 끝 났 기 때문에 마지막 단계 까지 실행 하면 f(x)의 호출 프레임 을 삭제 하고 g(3)의 호출 프레임 만 유지 할 수 있 습 니 다.이것 은 바로'꼬리 호출 최적화'(Tail calloptimization)라 고 하 는데 내부 함수 의 호출 프레임 만 유지 하 는 것 이다.모든 함수 가 끝 호출 이 라면 실행 할 때마다 프레임 을 호출 하 는 것 은 하나 뿐 이 므 로 메모 리 를 크게 절약 할 수 있 습 니 다.이것 이 바로'꼬리 호출 최적화'의 의미 다.
외부 함수 의 내부 변 수 를 사용 하지 않 아야 내부 함수 의 호출 프레임 이 외부 함수 의 호출 프레임 을 대체 할 수 있 습 니 다.그렇지 않 으 면'꼬리 호출 최적화'를 할 수 없습니다.
function addOne(a){
var one = 1;
function inner(b){
return b + one;
}
return inner(a);
}
관심 있 는 친 구 는 온라인 HTML/CSS/JavaScript 코드 실행 도 구 를 사용 할 수 있 습 니 다.http://tools.jb51.net/code/HtmlJsRun상기 코드 실행 효 과 를 테스트 할 수 있 습 니 다.더 많은 자 바스 크 립 트 관련 내용 은 본 사이트 의 주 제 를 볼 수 있 습 니 다.
본 고 에서 말 한 것 이 여러분 의 자 바스 크 립 트 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JavaScript로 카드 놀이를 넘기는 애니메이션을 만들려고했습니다.카드를 넘기는 애니메이션을 만들어 보았습니다. 폴더 구성은 다음과 같습니다. 코드는 다음과 같습니다. card_turning.html 다음은 JavaScript 코드입니다. cardTurning.js 결과는, 이런 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.