함수 선언문
함수를 정의하는 방식 중 함수 선언문(Function declaration)
방식이 있다. 기본적인 syntax는 다음과 같다.
function functionName(parameters) {
// 함수의 동작 코드
}
다음은 함수 선언문 방식의 특징이다.
function 키워드
를 사용한다.함수명은 생략할 수 없다
.함수 호이스팅
현상이 발생한다.)cf>
함수 표현식
으로 함수를 정의하면 함수 호이스팅이 아니라 변수 호이스팅
이 발생한다.함수 표현식을 사용할 것이 권장
된다.재귀 함수
함수가 자기 자신을 호출하는 것을 재귀 호출(recursive call)
이라 하고, 재귀 호출을 수행하는 함수가 바로 재귀 함수
이다. '함수명'과 '함수를 가리키는 식별자', 둘 다 재귀 호출을 가능하게 한다는 특징이 있다.
익명 함수일 때에도 가능하다.
고차함수 & 일급함수
함수의 매개변수를 통해 다른 함수의 '내부로 전달되는' 함수를, 콜백 함수 또는 일급 함수
라고 한다. 한편, 매개변수를 통해 함수의 외부에서 '콜백 함수를 전달받은' 함수를 고차 함수라고 한다.
*일급의 조건
렉시컬 스코프
함수를 어디에서 정의(호출 x)
했는지에 따라 함수의 상위 스코프가 결정된다는 입장이, 정적 스코프(static scope) 또는 렉시컬 스코프(lexical scope)
이다.
따라서, 특정 렉시컬 스코프의 상위 스코프는 언제나 자신이 정의된 스코프이다.
클로저
MDN에서는 클로저를 다음과 같이 정의하고 있다.
“A closure is the combination of a function and the lexical environment within which that function was declared.”
클로저는 '함수'와 '그 함수가 선언됐을 때의 렉시컬 환경(Lexical environment)'과의 조합이다.
위 코드에서 outerFn 함수는, innerFn 함수를 정의하고 innerFn 함수를 반환한다. innerFn 함수 내부에서는 x라는 변수를 사용하고 있는데, 여기서 x는 outerFn 함수 내부에 정의된 지역 변수이다.
outerFn 함수가 실행되면 x에 10이 할당되고, innerFn 함수를 반환한다. 이후 inner 변수에, 반환된 innerFn 함수가 할당된다.
inner 함수를 실행하면 innerFn 함수가 실행되며, x 변수의 값을 출력한다. 이때, x 변수는 outerFn 함수의 실행이 끝났음에도 불구하고 접근할 수 있는데, 이것이 바로 클로저의 동작 원리이다.
다시 MDN의 정의를 살펴보면, '함수'는 반환된 innerFn 함수를 의미하고, '그 함수가 선언될 때의 렉시컬 환경'이란 innerFn이 선언됐을 때의 스코프를 의미한다.
=>한마디로, 클로저는 자신이 생성될 때의 환경을 기억하는 함수다.