게시글

6만명이 선택한 평균 별점 4.9의 제로초 프로그래밍 강좌! 로드맵만 따라오면 됩니다! 클릭
강좌21 - NodeJS - 7년 전 등록 / 3년 전 수정

Node에서의 this

안녕하세요. 이번 시간에는 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에 대한 모든 강좌를 마칩니다~.

조회수:
0
목록
투표로 게시글에 관해 피드백을 해주시면 게시글 수정 시 반영됩니다. 오류가 있다면 어떤 부분에 오류가 있는지도 알려주세요! 잘못된 정보가 퍼져나가지 않도록 도와주세요.
Copyright 2016- . 무단 전재 및 재배포 금지. 출처 표기 시 인용 가능.
6만명이 선택한 평균 별점 4.9의 제로초 프로그래밍 강좌! 로드맵만 따라오면 됩니다! 클릭

댓글

4개의 댓글이 있습니다.
4년 전
왜 함수 일 때만 global이 나오나요? 그리고 화살표 함수에서 상위 환경이라는 것은 어떤 것을 말하는지 궁금합니다.
4년 전
함수일 때 global이 나오는 건 그렇게 정해져서고요. 상위 환경은 상위 스코프를 말합니다.
4년 전
답변 감사합니다. 궁금한점이 하나 더 있습니다. 그럼 module.exports가 global보다 더 상위 환경에 있다고 볼 수 있는 건가요??
4년 전
global은 전역이니 더 상위죠.
5년 전
안녕하세요. 다름이 아니라 제가 지금 사이드 프로젝트에서 헬스, 카페, 볼링 등등 이런 데이터를 얻어야하는데 이런 데이터가 이젠 네이버 검색엔진을 이용하면 위치, 설립자 등 정보가 다 뜨잖아요? 그러한 정보들은 네이버에 문의를해서 달라고 해야하나요? 아니면 nodejs 웹크롤링을해서 직접 가져와도 되는건가요?? 웹크롤링이라면 허락을 맡아야하나요?
5년 전
네이버에서 장소 관련 API를 제공하는 경우 그걸 사용하시면 됩니다. 크롤링은 대부분의 경우 허락을 받지 않으면 불법 소지가 있습니다. 프로젝트가 상용이 아니라면 괜찮을 수도 있습니다.
5년 전
알려주셔서 감사합니다.
5년 전
글로벌 영역의 this는 글로벌이 아닌데 로컬 영역의 this가 글로벌인게 참 희한하네요...
7년 전
Node 소스들을 보면 전역에서 화살표 함수를 잘 안쓰는 이유가 this가 global을 가르키지 않기 때문일까요?
7년 전
그것 때문에 안 쓴다기 보다는 코드가 옛날에 작성돼서(화살표함수가 없던 시절) 안 쓸 확률이 더 큽니다. 전역에서 this를 쓸 일은 거의 없습니다.