객체로서의 함수

lee jae hwan·2022년 7월 25일

javascript

목록 보기
36/107

함수는 Object으로부터 상속받은 콜러블객체임을 설명했다.
객체는 프로퍼티들을 가질 수 있는 구조이므로 함수도 프로퍼티를 가질 수 있다.

그렇다면 함수의 프로퍼티추가를 함수내부(본문)에 해야하나? 아니면 함수외부에 해야하나?
1. 함수내부에 추가할때

function sayHi() {  
  sayHi.counter =1; // 함수내에 프로퍼티추가
}
console.log(sayHi.counter); // undefined
sayHi();
console.log(sayHi.counter); // 1

위와같이 함수가 호출되어야 프로퍼티가 추가될뿐만아니라 호출될때마다 값이 할당된다. 따라서 값할당하는 연산이 있지않다면 프로퍼티로서 의미를 잃는다.


2. 함수외부에 추가할때
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;
}

위코드가 자바스크립트함수가 객체임을 잘보여준다

0개의 댓글