재귀함수 마지막 코플릿 문제를 풀다가 너무 안 풀려서 레퍼런스를 봤는데, concat을 이용해 기존 배열을 역순으로 리턴하는 걸 알게 됐다...
근데 레퍼런스를 봐도 이해가 가지 않는 부분이 있었다.
function result(arr) {
...
return result(/*arr의 나머지*/).concat(/*arr의 첫 번째*/);
}
내가 생각했을 때는
// arr = [1, 2, 3, 4]; 일 경우
// arr의 첫 번째 = 1
// arr의 나머지 = 2, 3, 4
// result([2, 3, 4]).concat(1) 로
// 결과값이 [2, 3, 4, 1]... [4, 1, 2, 3]으로 붙는다고 생각했다.
근데 브라우저 콘솔에 쳐봤을 때의 결과값은 역순이 맞길래 디버깅을 돌려봤는데
return result(/*arr의 나머지*/).concat(/*arr의 첫 번째*/);
마지막 이 부분이 실행되지 않은 채로 함수가 다시 호출되는 것이었다...!
곧바로 헬프데스크 이슈를 보았는데 나와 같은 생각을 하는 분이 계셔서 이슈 내용을 정독했다.
알고보니 메서드 체이닝과 관련이 있었고, 그것에 관련한 블로그 내용을 참조했다.
https://www.tutorialspoint.com/method-chaining-in-javascript
'메서드 체이닝은 앞서 실행된 함수가 반환한 것을 바탕으로 다음 함수가 앞서 실행한 반환한 것을 이어받아 다시 함수를 실행하는 것을 말합니다.
그렇기 때문에, 다시 호출되는 reverseArr 이라는 함수가 최종적으로 리턴을 하는 것을 받아서 concat을 진행하게 됩니다.'
✅ 함수가 한번 호출될 때 concat까지 실행하는 것이 아니라 해당 함수의 조건만큼 호출하고(또는 첫 번째 메서드를 실행) 결과를 반환, 그 다음 메서드인 concat 메서드를 실행한다.
_
한 문제, 한 문제가 너무 어렵고 큰 벽에 부딪히는 느낌이었다...
물론 모르는 문제를 이해하게 되고 내가 직접 풀었을 때 희열감은 정말 이루말할 수 없을만큼 좋지만 항상 뇌가 리셋되는 느낌이다 :( ...
이러다 내일 HA를 통과할 수 있을지 걱정되어 두렵고 하차하게될까봐 무섭다ㅎㅎㅎㅎ
일단 노트북 고장으로 못했던 과제를 끝내고 생각해야지... 😂