카테고리 없음

JS-함수 3

긤효중 2022. 7. 21. 00:15

함수 생성 시점과 함수 호이스팅

 

console.dir(add); //add(x,y)
console.dir(sub); //undefined

console.log(add(2,5)); //7
console.log(sub(2,5)); TypeError : sub is not definded

//함수 선언문
function add(x,y){
	return x+y;
}

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

위 예제에서 함수 선언문으로 선언한 ADD함수는 함수 선언문 이전에 호출할 수 있다.

그러나 함수 표현식으로 선언한 함수는 함수 표현식 이전에 호출 할 수 없다.

 

이는 함수 선언문으로 정의한 함수와 함수 표현식으로 정의한 함수의 생성 시점이 다르기 떄문이다.

함수 선언문도 코드가 한 줄 씩 순차적으로 실행되는 시점인 런타임 이전에 자바스크립트 엔진에 의해 실행된다.

 

 

즉, 함수 선언문으로 함수를 정의하면 런타임 이전에 함수 객체가 생성된다.

그리고 자바스크립트 엔진은 암묵적으로 함수 이름과 동일한 식별자를 만들고 이 식별자는 함수 객체를 가리킨다.

 

코드가 한 줄씩 실행되는 런타임에는 함수 객체가 생성되있고, 함수 이름과 동일한 식별자까지 만들어진 상태이다.

그래서 함수 선언문 이전에 함수를 호출 할 수 있고, 참조할 수 있다.

 

함수 선언문이 코드의 선두로 올라간 것처럼 동작하는 자바스크립트 고유의 특징을 함수 호이스팅이라고 한다.

 

함수 호이스팅변수 호이스팅은 차이가 존재한다.

var키워드를 사용한 변수 선언문과 함수 선언문은 런타임 이전에 자바스크립트 엔진에 의해서 생성되는 점과 식별자가 생성된다는 점은 동일하다.

하지만 var키워드를 사용한 변수는 undefined로 , 함수 선언문을 통해 생성된 함수의 식별자는 함수 객체 그 자체로 초기화된다.

 

따라서 var 키워드를 사용한 변수 선언문 이전에 변수를 참조하면 undefined로 평가되고,

함수 선언문을 이전에 함수를 호출하면 호출이 가능하다.

 

 

함수 리터럴과 호이스팅

함수 표현식은 변수에 할당되는 값함수 리터럴인 문이다.

따라서 함수 표현식은 변수 선언문과 변수 할당문을 한번에 기술한 것과 동일하게 작동한다.

즉, 변수 선언은 런타임 이전에 평가되어 undefined로 초기화되고,

변수 할당문의 값은 런타임에 평가되어서, 함수 표현식의 함수 리터럴도 런타임 (할당문)에 생성된다.

 

따라서 함수 표현식으로 함수를 정의하면 함수 호이스팅이 아닌, 변수 호이스팅이 발생한다.