Javascript

모던 자바스크립트 Deep Dive 읽기 - 12장 : 함수

띵킹 2022. 3. 16. 02:58

함수는 자바스크립트에서 가장 중요한 핵심 개념이다. 스코프, 실행 컨텍스트, 클로저, 생성자 함수에 의한 객체 생성, 메서드, this, 프로토타입 등 자바스크립트의 작동 원리 대부분이 함수와 연관되어 있다.

 

자바스크립트의 함수는 객체 타입의 값이다. 여러 값들 처럼 함수 또한 리터럴로 생성할 수 있다.

const 변수 = funciton 함수이름(매개변수 목록) {
	retrun 반환값;
}

다른 리터럴과 마찬가지로, 함수 리터럴도 평가되어 값을 생성하며, 이 값은 객체다. 즉 함수는 객체다.

 

자바스크립트에서 함수를 정의하는 방법은 4가지가 있다.

function 함수선언문(x) {
	return x;
{

const 함수표현식 = function (x) {
	return x;
};

const 생성자함수 = new Function('x', 'return x');

const 화살표함수 = x => x;

 

먼저 함수 선언문은 리터럴과 형태가 동일하나, 함수 리터럴과는 다르게 이름을 생략할 수 없다.

함수 선언문은 표현식이 아닌 문이기 때문에, 변수에 할당할 수 없다. 만약 할당하는 경우, 함수 선언문이 아닌 기명 함수 리터럴이 된다. 

함수 선언문의 이름은 자바스크립트의 엔진이 식별자를 암묵적으로 생성해 호출할 수 있다. 함수 선언문으로 호출하는 이름은, 함수의 이름이 아닌 자바스크립트 엔진이 암묵적으로 생성한 함수의 식별자이다. 

 

자바스크립트의 함수는 객체 타입의 값이다. 변수에 할당할 수도 있고, 프로퍼티의 값이 되며 배열의 요소가 될 수도 있다. 즉 일급 객체의 성질을 가지고 있다. 변수에 할당하는 경우, 이러한 함수 정의 방식을 함수 표현식이라 한다. 함수 표현식의 함수 리터럴에서, 함수의 이름은 생략할 수 있다. 변수의 값이 함수를 가리키기 때문에, 함수의 이름으로 호출할 수 없기 때문에 일반적으로 생략한다.

 

함수 선언문은 모든 선언문이 그렇듯, 런타임 이전에 자바스크립트 엔진에 의해 먼저 실행된다. 따라서 함수 선언문 이전에 함수를 참조하고 호출할 수 있다. 이러한 특징을 함수 호이스팅이라 한다. 

 

함수 표현식의 함수 리터럴은, 변수의 값이 평가되는 시점, 즉 런타임에 실행되므로 함수 표현식 이후에 참조 또는 호출해야 한다. 

 

함수는 일급 객체의 성질을 가지고 있다. 매개 변수에 값으로 사용할 수도 있고, 반환문에 값으로 평가되는 표현식으로 쓸 수도 있기 때문에 자기 자신을 호출하는 재귀함수, 함수를 합성하여 사용하는 콜백함수 등으로 사용할 수 있다. 

 

let 사람이름이 = ''

function 동탄() {
	사람이름이 = '엄준식'
}

동탄();
console.log(사람이름이); // 엄준식

위와 같이 함수가 외부 상태를 변경하는 경우를 비순수 함수라 한다. 이러한 경우는 코드의 복잡성을 증가시키고 상태 변화를 추적하기 어려워진다. 

 

반대로 인수의 불변성과 외부상태에 의존성이 없는 함수를 순수 함수라 한다. 이러한 순수 함수와 보조 함수의 조합을 통해 깔끔한 코딩을 하는 것이 함수형 프로그래밍의 지향점이다.

 

728x90