[TIL/JavaScript] 2023/06/17

원민관·2023년 6월 17일
0

[TIL]

목록 보기
82/159
post-thumbnail

함수 선언문

함수를 정의하는 방식 중 함수 선언문(Function declaration) 방식이 있다. 기본적인 syntax는 다음과 같다.

function functionName(parameters) {
  // 함수의 동작 코드
}

다음은 함수 선언문 방식의 특징이다.

  1. 함수 선언문은 function 키워드를 사용한다.
  2. 함수 선언문 방식으로 함수를 정의할 때, 함수명은 생략할 수 없다.
  3. 함수 선언문 방식으로 함수를 정의하면, runtime 이전에 자바스크립트 엔진에 의해 함수 객체가 먼저 생성된다.(=함수 호이스팅 현상이 발생한다.)

cf>

  1. 함수 표현식으로 함수를 정의하면 함수 호이스팅이 아니라 변수 호이스팅이 발생한다.
  2. 함수 호이스팅은 함수를 호출하기 전에 반드시 함수를 선언해야 한다는 당연한 규칙을 무시하기에, 함수 선언문 대신 함수 표현식을 사용할 것이 권장된다.

재귀 함수

함수가 자기 자신을 호출하는 것을 재귀 호출(recursive call)이라 하고, 재귀 호출을 수행하는 함수가 바로 재귀 함수이다. '함수명'과 '함수를 가리키는 식별자', 둘 다 재귀 호출을 가능하게 한다는 특징이 있다.

익명 함수일 때에도 가능하다.

고차함수 & 일급함수

함수의 매개변수를 통해 다른 함수의 '내부로 전달되는' 함수를, 콜백 함수 또는 일급 함수라고 한다. 한편, 매개변수를 통해 함수의 외부에서 '콜백 함수를 전달받은' 함수를 고차 함수라고 한다.

*일급의 조건

  1. 변수나 데이터에 담을 수 있어야 한다.
  2. 함수의 파라미터로 전달할 수 있어야 한다.
  3. 함수의 리턴값으로 사용할 수 있어야 한다.

렉시컬 스코프

함수를 어디에서 정의(호출 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이 선언됐을 때의 스코프를 의미한다.

=>한마디로, 클로저는 자신이 생성될 때의 환경을 기억하는 함수다.

profile
Write a little every day, without hope, without despair ✍️

0개의 댓글