= 함수가 자기 자신을 호출하는 것
실행 컨텍스트 스택
에 들어가는 실행 컨텍스트의 최댓값= execution context stack
= 함수 실행 절차에 대한 세부 정보를 저장하고 있는 내부 데이터 구조
등이 저장된다
실행 컨텍스트
는 함수 호출 1회당 1개씩 생성된다.
실행 컨텍스트 스택 (execution context stack)
에 저장됨실행 컨텍스트 스택
에서 임시 저장한 컨텍스트를 다시 꺼내와서 이어서 실행실행 컨텍스트는 메모리를 차지하기 때문에, 재귀가 많이 중첩될 수록 메모리를 많이 차지한다! 반면, 반복문은 전체 실행동안 실행 컨텍스트가 한 개 생성된다. 따라서 반복문이 메모리를 더 절약할 수 있는 방식이지만, 때에 따라 코드의 길이, 가독성, 유지보수 등을 모두 고려하여 더 적절한 구현법을 선택해야 한다.
구성요소
value
next
: 연결리스트에서 다음 요소를 참조하는 프로퍼티
연결 리스트의 첫 요소의 참조는 연결 리스트를 담는 변수명에 저장되어있다.
value와 next 직관적으로 보여주는 예시
let list = {
value: 1,
next: {
value: 2,
next: {
value: 3,
next: {
value: 4,
next: null
}
}
}
};
let list = { value: 1 };
list.next = { value: 2 };
list.next.next = { value: 3 };
list.next.next.next = { value: 4 };
list.next.next.next.next = null;
// 세번째 요소를 참조하는 새로운 연결리스트를 선언한다.
let secondList = list.next.next;
// 기존 연결리스트의 세번째 요소를 null로 비워준다.
list.next.next = null;
이 코드의 결과, list
연결리스트의 두번째 요소와 세번째 요소 간의 체인이 끊어지면서 하나의 연결리스트를 분리시킬 수 있다.
list.next.next = secondList;
위 코드에서 secondList
연결리스트의 첫 요소를 list
연결리스트의 세번째 요소로 지정한다.
그 결과, list
와 secondList
가 합쳐질 수 있게 된다.
list.next = list.next.next;
이 코드에서는 list
의 두번째 요소 자리에 list
의 세번째 요소를 집어넣어 준다.
즉, 기존의 list
의 두번째 요소는 삭제되고 그 뒤의 나머지 리스트가 한칸 앞으로 당겨져 온 형태와 같아진다.
// 배열 : arr
console.log(arr[5]);
// 연결리스트 : list
console.log(list.next.next.next.next);