함수표현식
자바스크립트에서 변수에 함수를 할당하는 방식을 함수표현식이라한다. 그렇다면 표현식이란 무엇인가?
간단히 말해서 값으로 평가되는 식이다. 또한 함수는 객체이므로 값의 성질을 갖는 일급객체이다.
함수표현식에서 함수의 이름은 객체의 내부에서만 동작한다. 함수를 외부에서 호출하려면 함수 이름이 아니라 함수 객체를 가리키는 식별자를 호출해야한다. 때문에 함수 표현식에서 함수의 이름을 생략하여 정의하여도 함수를 호출하는 데에는 아무 문제가 없다.
아래의 코드에서 변수 'data'는 함수 객체를 가리키는 식별자가 되고 'name'은 함수 내에서만 참조되는 함수 이름이다.
1
2
3
|
var data = function name() {console.log("data"); }
data(); //"data"
name(); //ReferenceError: name is not defined
|
cs |
함수선언문
우선, 함수선언문은 본래 '표현식이 아닌 문'이다. 값으로 평가될 수 없는 것이다. 자바스크립트에서 표현식은 피연산자로 사용될 수 있어야한다. 함수선언문을 그룹 연산자() 내에 묶어보자. 함수선언문이 피연산자로 사용된다. 여기서 함수 이름은 함수 몸체 내부에서만 유의미하므로 함수를 가리키고 있는 식별자가 없다. 따라서 함수 외부에서 함수에 접근할 수가 없다. 엄격히 따지면 함수선언문 그 자체는 값을 생성하거나 참조하지 않는 상태로,
'표현식이 아닌 문'이며(undefined), 식별자가 없어 외부에서 함수를 호출할 수도 없다.
자바스크립트에서 undefined는 값이 대입되지 않은 상태인 변수나 속성을 의미한다.
1
2
3
|
(function name() {console.log("data"); });
name(); //ReferenceError: name is not defined
|
cs |
하지만 자바스크립트에서 함수 선언문을 사용해보면 함수이름으로 함수를 호출할 수 있다.
엔진이 함수선언문을 알아서 함수 표현식으로 변환하기 때문이다. 좀 더 상세하게 얘기하자면 함수 이름과 동일한 이름의 식별자를 암묵적으로 생성하고, 함수 객체를 할당해준다.
1
2
|
function name() {console.log("data"); };
name(); //"data"
|
cs |
함수선언문과 함수표현식은 유사하게 동작한다. 함수선언문은 암묵적인 식별자가 생성되어 함수 표현식으로 변환하여 함수 객체를 생성하는 원리이고, 함수표현식은 변수라는 식별자에 함수 객체를 할당해주는 원리라는 미묘한 차이점을 잊지말자.
'공부 > Java script' 카테고리의 다른 글
[Java Script] 래퍼객체와 전역객체 (0) | 2021.11.01 |
---|---|
[JavaScript] 프로퍼티 어트리뷰트 : 프로퍼티의 세부설정 (1) | 2021.10.27 |
[Java Script]원시타입과 객체타입 (0) | 2021.10.20 |
자바스크립트로 숫자야구게임 만들기(2) (0) | 2021.01.23 |
자바스크립트로 숫자야구게임 만들기(1) (0) | 2021.01.19 |