함수
✏️ JavaScript 강의의 첫번째, 함수에 대해 정리해보겠습니다.
1. 데이터와 호출
- 함수 데이터와 호출 후 데이터는 완전히 다른 개념이다.
2. 선언과 표현
- 함수 선언문:
function 키워드로 시작하며, 기명 함수(이름이 있는 함수).
- 함수 표현식: 함수 선언문을 제외한 나머지 형태. 선언이 아닌 표현식. 함수 표현식에서 할당된 이름은 호이스팅 과정에서 사라진다.
3. 호이스팅
- 호이스팅: 함수 선언부가 유효 범위의 최상단으로 끌어올려지는 현상.
var 키워드 사용을 피하자.
- 함수는 호이스팅되지만, 표현식은 호이스팅되지 않는다.
4. 반환과 종료
return 키워드를 사용하여 함수 안에서 데이터를 외부로 내보낸다.
return 키워드 사용 시, 함수가 종료되므로 그 이후의 코드는 실행되지 않는다.
- 반환하지 않는 함수(결과가
undefined인 함수)를 'void 함수'라고 부른다.
5. 매개변수
- 매개변수는 함수 내에서 데이터의 매개체가 되는 변수이다.
- 유효범위는 함수의 블록 레벨이다.
- 매개변수에 기본값이 없으면 암시적으로
undefined이다.
6. 구조 분해 할당
- 객체나 배열 데이터를 분해해서 필요한 데이터만 꺼내어 사용한다.
- 배열 데이터에서 필요없는 변수는
,를 사용하여 생략할 수 있다.
- 💡 객체 데이터는 순서가 없는 속성(key-value)으로 이루어져 있다.
7. 나머지 매개변수
- 나머지 매개변수는 모든 나머지를 하나의 배열로 가져온다.
- 전개 연산자(
...)를 사용하여 나머지 매개변수를 표현한다.
8. arguments 객체
arguments는 함수 내에서 언제든지 사용 가능한 내장 객체이다.
- 보통은 나머지 매개변수를 사용하는 것이 더 권장된다.
9. 화살표 함수
- 화살표 함수와 일반 함수는
this 키워드의 차이가 있다.
() => {} 형태로 표현된다.
10. 즉시실행함수
- 함수는 호출되어야 의미가 있는데, 익명함수를 정의하고 즉시 호출하는 것을 즉시실행함수라고 한다.
; (함수)();가 일반적인 패턴이다.
- 모듈 시스템 도입으로 사용빈도가 낮아졌다.
11. 콜백
- 함수를 다른 함수의 인수로 전달하는 것을 콜백이라고 한다.
- 주로 어떤 행위를 마친 후의 결과로 사용된다.
12. 호출 스케줄링
setTimeout과 setInterval을 사용하여 일정 시간 후에 또는 주기적으로 함수를 실행할 수 있다.
clearInterval을 통해 메모리 누수를 방지한다.
- 정확한 시간을 보장해야 할 때는 TaskTimer 라이브러리를 사용하는 것이 좋다.
13. 재귀
- 함수가 자기 자신을 다시 호출하는 것을 재귀라고 한다.
- 종료 조건을 반드시 정의해야 한다.
14. 렉시컬 스코프
- 렉시컬 스코프는 함수가 정의될 때의 유효범위를 말한다.
- 정의될 때의 렉시컬 스코프가 정적(변하지 않음)으로 유지된다.

→ 위 예시에서, C 함수의 렉시컬 스코프는 A함수 까지, X 함수는 아니다.
15. this
function 함수와 화살표 함수는 this 키워드 동작이 다르다.
function 함수는 호출 위치에서 this가 정의되며, 화살표 함수는 선언된 위치에서 this가 정의된다.
- 예시:
- getFullA는 일반함수, getFullB는 화살표함수
- user라는 함수에서this는utils` 이다.

16. call, apply, bind
- 객체가 함수를 빌려서 사용하는 메서드들이다.
- 서로 사용패턴만 다르고, 보통
call 을 많이 쓴다
call: 함수를 호출하면서 인수를 개별적으로 전달한다.
apply: 함수를 호출하면서 인수를 배열로 묶어서 전달한다.
bind: 함수를 호출하지 않고, 새로운 함수를 반환한다.
17. 클로저
- 클로저는 함수가 선언될 때의 렉시컬 스코프를 기억하고 있다가 나중에 실행될 때 해당 스코프에 접근할 수 있는 구조입니다.
- 함수가 다른 스코프에서 호출되어도, 그 함수가 선언될 당시의 환경을 기억하여 사용할 수 있도록 합니다.
- 클로저는 주로 외부 함수의 변수를 보호하고 내부 함수가 그 변수에 접근할 수 있게 하는 등의 용도로 사용됩니다.
18. 함수 커링
- 함수 커링은 인수가 두 개 이상인 함수를 하나씩만 받아서 처리할 수 있도록 하는 것이다.
- 부분 적용(partial application)을 통해 함수의 일부 인수를 미리 설정하고, 나머지 인수를 나중에 제공할 수 있도록 합니다.
<참조>
📍 박영웅 강사님 JavaScript 강의
📍 모던 자바스크립트 Deep Dive