Arguments.Callee

장윤희·2022년 6월 24일
0

JsPatterns

목록 보기
5/5
post-thumbnail

arguments.callee?

자바스크립트의 함수는 arguments 객체를 가지고 있습니다. 이를 사용하면 현재 실행중인 함수 개체를 반환하는데 함수 실행시 넘어온 인지(arguments)는 물론 callee()를 사용해 재귀함수로써 반복도 가능하게 된다.

  • callee는 arguments 객체의 속성입니다.
  • 함수의 몸통(body) 내에서 현재 실행 중인 함수를 참조하는 데 쓰일 수 있다.
  • 이는 함수의 이름을 알 수 없는 경우에 유용하다.
    예를들어 이름 없는 함수 식 "익명 함수" 내에서.

변수가 아닌 arguments를 사용하여 접근

var test = function(a, b, c) {
  return arguments[0] + arguments[1] + arguments[2];
};

test(1,2,3); // 6을 반환

즉, 함수 내부에서 변수명인 a, b, c를 사용하지 않아도 arguments 객체로 접근이 가능하다.

arguments는 배열 타입? No !
arguments는 배열의 형태를 띠고 있지만 배열은 아니다.
배열이 가지는 기본 프로퍼티와는 다르므로 객체로 보는 것이 맞을 것이다.

arguments 객체를 사용하여 재귀함수 만들기

0부터 n까지의 합을 구하는 함수(재귀함수 사용)

function test(num) {
  if (num == 0) {
    return num;
  }
  else {
    return num + arguments.callee(num-1);
  }
}

test(2);
// 3을 반환

test(10);
// 55를 반환

재귀함수는 여러번 반복해야 하는 연산을 더 간단하게 구현할 수 있게 한다.

익명 재귀 함수에서 arguments.callee 사용하기

재귀 함수는 자신을 참조할 수 있어야 한다.

보통, 함수는 그 이름으로 자신을 참조하지만 익명 함수(함수 식 또는 Function 생성자로 생성될 수 있는)는 이름이 없기 때문에 그를 참조하는 액세스 가능한 변수가 없는 경우, 함수가 자신을 참조할 수 있는 유일한 방법은 arguments.callee에 의해서이다.

다음 예는 차례로 팩토리얼 함수를 정의하고 반환하는 함수를 정의한다.

function create() {
   return function(n) {
      if (n <= 1)
         return 1;
      return n * arguments.callee(n - 1);
   };
}

var result = create()(5); // 반환값 120 (5 * 4 * 3 * 2 * 1)

이것은 매우 실용적이지 않고 같은 결과가 유명 함수 식으로 달성될 수 없는 경우가 거의 없다. 뭔말이지

ES 6의 arrow function인 화살표 함수에서는 arguments 객체를 가지고 있지 않기 때문에 재귀함수를 만들 수 없다.
ECMAScript 제5판(ES5) 은 엄격 모드 (en-US)에서 arguments.callee()의 사용을 금한다.
function 식(expression)에 이름을 주거나 함수 자체를 호출해야 하는 곳에 function 선언을 사용하여 arguments.callee() 사용을 피하자.

참고 자료
https://webisfree.com/2015-07-08/[%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8]-arguments-callee-%EC%86%8D%EC%84%B1-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Functions/arguments/callee

profile
멋쟁이

0개의 댓글