안녕하세요. 이번 시간에는 Node에서의 this에 대해 다뤄보겠습니다.
자바스크립트의 this는 많은 분들을 헷갈리게 하는데요. 제가 실행 컨텍스트 강좌 와 this 강좌에서 this가 무엇인지 쉽게 설명해두었습니다. 그런데 노드에서는 this가 또 다릅니다. 물론 큰 원칙에서는 일관성이 있지만 세세한 부분이 다르기 때문에 알아보도록 하겠습니다.
test.js
console.log(this)
this가 뭔지 콘솔 로그 해보고, 노드로 실행해 봅시다.
$ node test
{}
오잉, window가 아니라 빈 객체가 나오네요? 사실 window와 document는 Node에 없는 객체입니다. 두 객체는 브라우저 런타임에서 넣어주는 객체이기 때문이죠. 노드는 브라우저와는 다른 런타임이기 때문에 DOM과 관련된 두 객체를 넣지 않습니다. 이제 빈 객체의 정체를 알아봅시다.
test.js
console.log(this, module.exports, exports);
console.log(this === module.exports);
console.log(this === exports);
console.log(module.exports === exports);
$ node test
{} {} {}
true
true
true
네, Node에서의 this는 바로 module.exports 입니다. 파일을 모듈로 사용할 수 있게 해주는 객체이죠. module.exports와 exports, this는 같습니다. 삼위일체인 셈이죠.
그렇다면 노드에서 this는 왜 전역 객체(global, 브라우저의 window 급)을 가리키지 않을까요? 사실 가리키는 경우도 있긴 합니다.
test.js
function a() {
console.log('a', this === exports, this === global);
}
const b = () => {
console.log('b', this === exports);
};
a();
b();
$ node test
a false true
b true
전역 환경에서의 this만 module.exports고, 함수 선언문 안의 this는 global입니다! 매우 놀라운 현상이죠. 화살표 함수의 경우는 this가 상위 환경의 this를 물려받기 때문에 module.exports와 같습니다.
노드에서는 전역 환경의 this만 global이 아니라 module.exports를 가리킨다는 사실을 알아두세요.
예외가 더 있는데 setTimeout의 this는 Timeout 객체입니다.
setTimeout(function() {
console.log(this); // Timeout
})
이상으로 this에 대한 모든 강좌를 마칩니다~.