책 인사이드 자바스크립트를 읽고 정리한 내용입니다.
자바스크립트에서는 함수도 객체이다. 자바스크립트의 데이터타입의 참조타입에서도 설명했 듯이 객체는 동적으로 프로퍼티를 추가할 수 있다. 함수도 마찬가지로 객체이기 때문에 동적으로 프로퍼티를 추가할 수 도 있다.
function add(x,y) { return x+y; }
add.status = "OK";
add.result = 5;
이러한 특징 때문에 함수는 다음과 같이 동작할 수 있다.
이러한 특징이 있는 함수를 일급 객체
라고 부른다.
함수는 다른 객체들과는 다르게 함수 객체만의 표준 프로퍼티가 있다. ECMA 스크립트에는 모든 함수가 length와 prototype 프로퍼티를 가져야한다고 나와있다.
prototype은 매우 중요하니 자세히 살펴보자.
먼저 헷갈릴 수 있는 요소들을 정리해보았다. 위의 add 함수를 console.dir(add)로 출력해보았다.
__proto__
는 같은건가 ?__proto__
)을 내부 프로퍼티로 가지고 있다.이 prototype 프로퍼티는 constructor 프로퍼티 하나만 있는 객체를 가리킨다. 이 객체의 constructor는 객체를 가리키고 있는 함수(즉 add 함수)를 참조한다.
함수 안에 또 다른 함수가 있는 경우 이 함수를 내부함수 (inner function)이라고 한다.
function parent(){
var a = 100;
var b = 200;
function child(){
var b = 300;
console.log(a);
console.log(b);
}
child();
}
parent(); // 100 300
child(); // Uncaught Reference error : child is not defined
🌟 중요 포인트
하지만 함수 외부에서도 특정함수 내부에 있는 함수를 호출할 수 있는 방법이 있다. 부모 함수가 내부 함수를 리턴 하면 부모 밖에서도 내부 함수를 호출할 수 있다.
function parent(){
var a = 100;
var b = 200;
function child(){
console.log(b);
}
return child;
}
var inner = parent();
inner();