더북(TheBook)

예를 들어 객체 표현식에서 익명 함수 표현식의 결과를 속성에 할당하면 함수는 속성의 이름을 가져온다(5장에서 배울 메서드 구문을 사용하는 경우에도 작동한다).

const obj = {
    foo: function() {
    }
};
console.log(obj.foo.name); // "foo"

심지어 함수를 기본 매개변수 값으로 사용할 때도 작동한다.

(function(callback = function() { }) {
    console.log(callback.name); // "callback"
})();

놀랍게도 함수의 이름을 설정하지 않는 작업이 하나 있다. 기존 객체의 객체 속성에 할당하는 것이다. 예를 들어 다음을 보자.

const obj = {};
obj.foo = function() {
};
console.log(obj.foo.name); // "" - 이름이 없다.

왜 없을까? TC39는 이와 같은 특별한 사용을 너무 많은 정보 유출로 간주했다. 앱에 사용자와 관련된 일부 비밀 정보로 키가 지정된 핸들러 캐시가 있고 핸들러를 일부 외부 코드에 전달해야 한다고 가정해 보자. 다음과 같은 핸들러를 생성한 예를 보자.

cache[getUserSecret(user)] = function() {};

함수 이름은 해당 작업에 의해 설정되었으며 핸들러 함수를 타사 코드에 제공하면 getUserSecret (user)의 값이 제공된다. 따라서 위원회는 함수 이름 설정에서 특정 작업을 의도적으로 생략했다.

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