(0, function)()

김동현·2024년 2월 14일
0

Nestjs

목록 보기
5/6
post-thumbnail

__decorate

Nestjs에서 Module 데코레이터를 분석하다가 신기한 패턴을 발견했다.

(0, common_1.Module)(...) 패턴이었다.

🤔🤔🤔🤔 ???? 뭐지???

Debug!

아래와 같이 console.log((0, common_1.Module)); 을 찍어보고 디버깅을 실시해 보았다.

위 gif 파일을 보면 app.module.ts의 Decorator가 실행되고 다시 app.module.js로 돌아가면 해당 로직이 사라져 있었다...

(0, func)()

function func() {
    console.log("함수가 실행됩니다.");
}

(0, func)(); // 함수가 실행됩니다.
(1, func)(); // 함수가 실행됩니다.
(2, func)(); // 함수가 실행됩니다.
(3, func)(); // 함수가 실행됩니다.
('뭐지?', func)(); // 함수가 실행됩니다.

What is the meaning of (0, someFunction)() in javascript [duplicate]

쉼표 연산자(영어 버전 MDN)

쉼표 연산자는 각각의 피연산자를 왼쪽에서 오른쪽 순서로 평가하고, 마지막 연산자의 값을 반환하는 연산자이다.

한국어로 변역된 MDN에는 해당 내용이 없다...

콤마 연산자 영문 버전의 추가적인 내용이 있는 Discarding reference binding에 들어가보자

영문 버전에 존재하는 추가적인 comma 연산자 내용을 보면 아래와 같다.

The comma operator always returns the last expression as a value instead of a reference. This causes some contextual information such as the this binding to be lost. For example, a property access returns a reference to the function, which also remembers the object that it's accessed on, so that calling the property works properly. If the method is returned from a comma expression, then the function is called as if it's a new function value, and this is undefined.

const obj = {
  value: "obj",
  method() {
    console.log(this.value);
  },
};

obj.method(); // "obj"
(obj.method)(); // "obj" (the grouping operator still returns the reference)
(0, obj.method)(); // undefined (the comma operator returns a new value)

💡 쉼표 연산자는 마지막 표현식을 반환할 때 참조값이 아닌 값(value)로 반환한다.
이 때 바인딩된 일부 컨텍스트 정보가 손실 되는 것이다.
즉, 메서드가 쉼표 연산자에 의해 반환되게 되면 새롭게 정의되지 않은 함수가 호출되게 된다!

-> 연관된 컨텍스트를 없애고 해당 함수를 한 번 호출하고 마는 것이다.

그럼 왜 (0, common_1.Module)?

🤔 @nestjs/commonmodule.decorator.ts를 보면 위와 같이 구현되어 있는 데 연관된 컨텍스트를 전부 없앤 뒤 함수 자체로만 쓰고 싶어서 그런 것아닐까..?

아직 완벽하게 어떤 효과가 있는지 이해하지 못했다...
시간을 내서 더 찾아보아야 겠다 :)

한글 번역된 comma operator에도 해당 내용이 있었으면 ㅠㅠ
MDN 공식 문서를 볼 때 영문도 꼭 같이 보는 습관을 들여야겠다...

profile
달려보자

0개의 댓글