더북(TheBook)

line.x 함수에도 자바스크립트 함수 오버로딩이 있다. arguments가 포함된 if 조건문을 보자.


line.x=function(funcToGetX) {
  if(!arguments.length) return getX;
  getX=funcToGetX;
  returnline;
 };

 

arguments는 호출한 함수의 인자를 담은 유사 배열 (array-like)객체로 함수 내부에서 사용된다. if문은 이 유사 배열 길이를 체크해서 인자가 하나도 없으면 길이는 0이고, 자바스크립트에서 0falsy 값이므로(25 장의 ‘ 모든 값은 Truthy 아니면 Falsy다 ’ 절 참조) getX 값을 있는 그대로 반환한다.

다시 말해 인자 없이 line.x를 호출하면 x 좌표의 현재 접근자(accessor)를 내어준다. 인자가 있으면 x좌표 접근자를 주어진 인자로 바꾼 뒤, 전혀 다른 반환값인 line 함수 객체를 돌려준다. 인자 i도 같은 방법으로 함수 오버로딩을 할 수 있다.

TIP

자바스크립트에서 객체 지향적 함수 오버로딩 개념은 함수의 arguments를 보고 여기에 뭔가 맞추는 행위다.

 

그런데 x 좌표 접근자를 지정하는 함수가 왜 굳이 line을 반환했을까? 짐작한 독자도 있겠지만, 예제 1-4처럼 호출을 체이닝(chaining)할 수 있기 때문이다.


lineGenerator = rj3.svg.line()
  .x(function(d) { return d.x; })
  .y(function(d) { return d.y; }),

 

호출 체이닝은 15장에서 자세히 다룬다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.