모던 자바스크립트 Deep Dive | 함수 선언식 과 함수 표현식

devcmkim·2022년 10월 26일
0
post-thumbnail

위 포스팅은 모던 자바스크립트 Deep Drive 를 공부하며 정리한 글입니다.

✏️ 함수 정의란?

함수 정의란 함수를 호출하기 이전에 인수를 전달받을 매개변수(parameter)와 실행할 문들, 그리고 반환할 값(return) 을 지정하는 것을 말한다.
함수를 정의하는 방법에는 4가지(함수 선언문, 함수 표현식,Function 생성자 함수, 화살표함수) 가 있다.
오늘알아볼 개념은 함수 선언문함수 표현식이다.

1. 함수 선언식 | Function Declarations

함수 선언문은 함수 리터럴과 형태가 동일하다. 단 함수 리터럴은 함수 이름을 생략할 수 있으나 함수 선언문은 함수 이름을 생략할 수 없다.

 function foo() {
  return 'hello';
}

함수 선언문은 표현식이 아닌 문이다. 따라서 크롬 개발자 도구의 콘솔에서 함수 선언문을 실행하면 undefined 가 출력된다.

2. 함수 표현식 | Function Expression

함수는 일급객체 이므로 함수 리터럴로 생성한 함수 객체럴 변수에 할당할 수 있다.
일급 객체란 값의 성질을 갖는 객체를 말하는데, 함수가 일급 객체라는 것은 함수를 값처럼 자유롭게 사용할 수 있다는 의미다.

이러한 함수 정의방식을 함수표현식 이라 한다.

var foo = function name() {
  return 'hello';
}
console.log(foo()); 

함수를 호출할 때는 함수 이름이 아니라 함수 객체를 가르키는 식별자를 사용해야 한다.
함수 이름은 함수 몸체 내부에서만 유효한 식별자이므로 함수 이름으로 함수를 호출할 수 없다.

3. 함수 선언식과 표현식의 차이점

함수 선언식은 호이스팅에 영향을 받지만, 함수 표현식은 호이스팅에 영향을 받지 않는다.

✏️ 호이스팅 이란 ?

함수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징이다.

함수 표현식으로 함수를 정의하면 함수 호이스팅이 발생하는 것이 아니라 변수 호이스팅이 발생한다.

console.dir(add); 
console.dir(sub); 

console.log(add(2,5)); //7
console.log(sub(2,5));  //Type Error

//함수 선언문
function add(x,y) {
  return x + y;
}
// 함수 표현식
var sub = function(x,y) {
 return x - y;
}

위 코드와 같이 함수 선언문으로 정의한 함수는 함수 선언문 이전에 호출할 수 있다. 그러나 함수 표현식으로 정의한 함수는 함수 표현식 이전에 호출할 수 없다.
함수 선언문으로 정의한 함수와 함수 표현식으로 정의한 함수의 생성 시점이 다르기 때문이다.

코드가 한 줄씩 순차적으로 실행되기 시작하는 런타임에는 이미 함수 객체가 생성되어 있고 함수 이름과 동일한 식별자에 할당까지 완료된 상태다. 따라서 함수 선언문 이전에 함수를 참조할 수 있으며 호출할 수도 있다.


✏️ 함수 호이스팅과 변수 호이스팅

함수 호이스팅과 변수 호이스팅은 미묘한 차이가 있다.
var 키워드를 사용한 변수 선언문과 함수 선언문은 런타임 이전에 자바스크립트 엔진에 의해 먼저 실행되어 식별자를 실행 한다는것은 동일하다.

하지만 var 키워드로 선언된 변수는 undefined로 초기화되고, 함수 선언문을 통해 암묵적으로 생성된 식별자는 함수 객체초기화된다.

따라서 var 키워드를 사용한 변수 선언문 이전에 변수를 참조 하면 변수 호이스팅에 의해 undefined로 평가되지만 함수 선언문으로 정의한 함수를 함수 선언문 이전에 호출하면 함수 호이스팅에 의해 호출이 가능하다.

함수 표현식은 변수에 할당되는 값이 함수 리터럴인 문이다.
따라서 함수 표현식은 변수 선언문과 변수 할당문을 한 번에 기술한 축약 표현과 동일하게 동작한다.

변수 선언은 런타임 이전에 실행되어 undefined로 초기화되지만 변수 할당문의 값은 할당문이 실행되는 시점, 즉 런타임에 평가되므로 함수 표현식의 함수 리터럴도 할당문이 실행되는 시점에 평가되어 함수 객체가 된다.

profile
Frontend Developer

0개의 댓글