자바스크립트 함수 선언문과 함수 리터럴의 기명함수

boyeonJ·2023년 6월 24일
0

JavaScript Basic

목록 보기
7/24
post-thumbnail

함수 선언문과 함수 리터럴의 기명함수

함수 선언문과 함수 리터럴의 기명함수는 동일하게 표현된다. 이 둘의 차이점은 무엇일까? 🧐

변수에 할당 가능할까?

일단 함수 리터럴은 표현식이고, 함수 선언문은 표현식이 아니다. 따라서 함수 리터럴만 변수에 할당된다.

그렇다면 아래의 코드는 함수 선언문일까? 함수 리터럴일까?
정답은 함수 리터럴이다!

const add = function add(x,y){
	return x+y;
}
console.log(add(2,5));

기명 함수는 중의적인 코드이다. 자바스크립트는 이런 중의적인 코드는 문맥에 따라 해석을 다르게 한다.

함수 선언문 : 단독으로 사용
함수 리터럴 : 값을 평가 되어야 하는 문맥

호출이 가능할까?

함수 호출은 함수 선언문만 가능하다.
함수의 이름은 함수 몸체 내에서만 참조할 수 있는 식별자이다.
따라서 함수 이름으로는 호출이 불가능하다.
함수를 호출하기 위해서는 함수 객체를 가리키는 식별자가 필요하다.

🔎 함수의 이름은 함수 몸체 내에서만 참조할 수 있는 식별자인 이유는 변수의 스코프(scope)와 관련이 있습니다.

스코프는 변수와 식별자가 유효한 범위를 나타내는 개념입니다. 함수는 자체적으로 독립적인 스코프를 가지며, 함수 내에서 정의된 변수와 식별자는 해당 함수의 스코프에만 속합니다. 이것을 지역 스코프(local scope)라고도 합니다.
이러한 설계는 코드의 모듈성과 격리성을 유지하기 위한 목적으로 이루어졌습니다. 또한, 함수의 인터페이스를 명확히 할 수 있습니다.

함수 선언문은 호출이 필요하기 때문에, 자바스크립트 엔진이 암묵적으로 함수 이름과 동일한 식별자를 암묵적으로 생성하고, 함수에 할당한다. 따라서 함수 선언문만 호출이 가능하다.

⛔ 여기서 중요한점은 함수 선언문은 함수 이름으로 호출되는 것이 아니라 암묵적으로 생성된 변수로 호출이 가능하다는 점이다.

이를 의사코드로 표현하면 다음과 같다. 그런데 아래의 의사코드는 마치 함수표현식과 같다!

var add = function add(x, y) {
	return x + y;
}
console.log(add(2,5));

0개의 댓글