2016년 10월 19일 수요일

[javascript patterns] 스터디 08

자기 자신을 정의하는 함수

함수는 동적으로 정의할 수 있고 변수에 할당할 수 있다. 새로운 함수를 만들어 이미 다른 함수를 가지고 있는 변수에 할당한다면, 새로운 함수가 이전 함수를 덮어쓰게 된다. (그러니까 이미 존재하는 함수가 있어도 덮어쓴다는 말)
어떻게 보면 함수 포인터를 재사용하는 것이다. 자기 자신을 정의하는 함수은 자기 자신을 덮어써서 재정의(재사용)하는 것이다.
var run = function() {
  alert("run!");
  run = function() {
    alert("run faster! ");
  }
}

// 자기 자신을 정의하는 함수를 사용
run(); // run!
run(); // run faster!
이 패턴은 함수가 어떤 초기화 준비 작업을 단 한 번만 수행할 경우에 유용하다(한 번쓰고 바로 덮어씌어지기 때문에). 단점은 자기 자신을 재정의한 후, 원본 함수에 추가했던 프로퍼티들을 모두 찾을 수 없다. 또한 객체의 매서드로 사용되면 처음 실행할 때 처음 것이 실행될 수도 있다.(다른 변수에 할당 되었을 시에도 동일)
이 함수를 일급 객체로 사용하는 예를 살펴보자.
// 새로운 프로퍼티 추가
var run = function() {
  alert("run!");
  run = function() {
    alert("run faster! ");
  }
}
run.property = '일급객체로 사용한다.';

// 1. 다른 이름으로 할당한다.
var go1 = run;

// 2. 메서드로 사용한다.
var go2 = {
  a : run
};

// 새로운 이름으로 호출
go1(); //"run"
go1(); //"run"
console.log(go1.property); // '일급객체로 사용한다.'

// 메서드로 호출
go2.a(); // "run"
go2.a(); // "run"
console.log(go2.a.property); // '일급객체로 사용한다.'

// 자기 자신을 재정의한 함수
run();
run();
console.log(run.property); // undefined
함수가 새로운 변수에 할당되면 예상과 달리 자기 자신을 정의하지 않는다. 이 호출들은 계속해서 전역 run() 포인터를 덮어 쓴다. 따라서 마지막에 전역 run()가 호출되었을 때 비로소, 변화된 것이 갱신된다.

댓글 없음:

댓글 쓰기