함수는 Object으로부터 상속받은 콜러블객체임을 설명했다.
객체는 프로퍼티들을 가질 수 있는 구조이므로 함수도 프로퍼티를 가질 수 있다.
그렇다면 함수의 프로퍼티추가를 함수내부(본문)에 해야하나? 아니면 함수외부에 해야하나?
1. 함수내부에 추가할때
function sayHi() {
sayHi.counter =1; // 함수내에 프로퍼티추가
}
console.log(sayHi.counter); // undefined
sayHi();
console.log(sayHi.counter); // 1
위와같이 함수가 호출되어야 프로퍼티가 추가될뿐만아니라 호출될때마다 값이 할당된다. 따라서 값할당하는 연산이 있지않다면 프로퍼티로서 의미를 잃는다.
function sayHi() {
sayHi.counter++;
console.log(sayHi.counter);
}
sayHi.counter = 0;
sayHi(); // 1
외부에서 프로퍼티를 추가하고 함수내에서 접근이 가능하다.
function sayHi() {
console.log(this.counter);
}
sayHi.counter = 0;
sayHi(); // undefined
sayHi는 객체메소드가 아니고 전역범위내에 있는 함수이므로 전역객체(브라우저에서는 window)의 메소드이기때문에 this는 window가 된다. 자기자신을 찾지못한다. 메소드는 객체의 프로퍼티임을 명심해야 한다.
자바스크립트의 모든 함수는 생성될때 name, length(매개변수갯수)속성이 추가되며 외부실행컨텍스트객체를 참조하는 [[Environment]]숨김속성이 추가된다.
function makeCounter() {
let count = 0;
let fn = function(){
return count++;
}
fn.set =function(num){
count=num;
}
fn.decrease=function(){
--count;
}
return fn;
}
위코드가 자바스크립트함수가 객체임을 잘보여준다