기은P
시간이 멈추는 장소
기은P
  • Programming (272)
    • 개발노트 (1)
    • FrontEnd (56)
      • ES&JS 문법 (14)
      • HTML&CSS (4)
      • React 기본 (18)
      • React 심화 (12)
      • React 이슈 (2)
      • Project 연습 (1)
      • Next.js (5)
    • Backend&Devops (33)
      • AWS (2)
      • Docker (9)
      • Jenkins (6)
      • Nginx (6)
      • Node.js (1)
      • ElasticSearch (5)
      • 프레임워크&아키텍처 (2)
      • 암호화 (0)
      • 기타 (2)
    • 알고리즘 (3)
    • C# (8)
      • WPF (8)
    • Java (51)
      • 순수 Java (18)
      • RDF&Jena (12)
      • RCP&GEF (9)
      • JMX (5)
      • JMapper (3)
      • 오류해결 (4)
    • Database (21)
      • RDBMS (9)
      • NoSQL (2)
      • TSDB (1)
      • GraphQL (1)
      • Hibernate (3)
      • 데이터베이스 이론 (4)
      • Redis (1)
    • 프로토콜 (11)
      • Netty (4)
      • gRPC (5)
      • 프로토콜 개념 (2)
    • Server (4)
      • Linux (4)
    • 2020 정보처리기사 필기 (43)
      • 목차 (1)
      • 기출문제 (1)
      • 1과목 - 소프트웨어 설계 (6)
      • 2과목 - 소프트웨어 개발 (7)
      • 3과목 - 데이터베이스 구축 (8)
      • 4과목 - 프로그래밍 언어 활용 (7)
      • 5과목 - 정보시스템 구축 관리 (10)
    • 2020 정보처리기사 실기 (31)
      • 목차 (4)
      • 기출예상문제 (19)
      • 실기요약 (8)
    • 빅데이터분석기사 필기 (4)
      • 목차 (0)
      • 필기 요약 (3)
    • 전기 공학 (1)
      • CIM (1)
    • 산업자동화시스템 (3)
      • SCADA (1)
      • OPC UA (2)
    • 디자인패턴 (1)
    • 휴지통 (0)

공지사항

  • 공지사항/포스팅 예정 항목

최근 댓글

최근 글

전체 방문자
오늘
어제

티스토리

hELLO · Designed By 정상우.
기은P

시간이 멈추는 장소

FrontEnd/ES&JS 문법

[Javascript] this 정리

2022. 10. 20. 13:24
반응형

1. this의 정의 

자바스크립트의 this는 현재 실행 문맥이라고 합니다. 여기서 현재 실행 문맥이라는 건 호출자를 뜻하는데, 호출자는 크게 세 가지로 나뉘어집니다.

 

  • 객체의 메소드
  • 함수
  • 생성자 함수

 

만약 this가 나온다면 세 가지 경우 중 하나인 함수호출방식에 따라 누가 호출했는지 보고 this가 어떤 의미를 가지는지를 따져보면 됩니다. 이를 함수 호출 패턴이라고 하며, 자바스크립트의 this 는 함수 호출 패턴에 따라 this 가 어떤 객체의 this 가 될 지 정해지고, 이것을 this 바인딩이라고 합니다.

 

 

 2. 사용방법

2-1) 객체의 메소드 호출할 때의 this 바인딩

var obj = {
  name: ‘test’
  sayName: function() {
    console.log(this.name);
  }
};
 
var kim = obj;
kim.name = "kim";
kim.sayName(); // "kim"
 
var lee = obj;
lee.name = "lee";
lee.sayName(); // "lee"

위와 같이 함수가 객체의 프로퍼티 값이면, 자신을 호출한 객체에 바인딩이 되며, 메소드로서 호출됩니다.

 

 

 

 

2-2) 함수를 호출할 때의 this 바인딩

기본적으로 this는 전역 개체(window)에 바인딩 되서 아래 코드처럼 this를 사용하면 전역에 있는 val 변수에 할당된 Hello가 출력됩니다.

var val = "Hello";
 
var func = function() {
  console.log(this.val);
};
func(); // "Hello"
console.log(this.val); // "Hello"
console.log(window.val); //  "Hello"
console.log(this === window); // true

 

 

콜백함수도 마찬가지로 this는 전역객체에 바인딩 됩니다.

var value = 1;
 
var obj = {
  value: 100,
  foo: function() {
    setTimeout(function() {
      console.log("callback's this: ",  this);  // window
      console.log("callback's this.value: ",  this.value); // 1
    }, 100);
  }
};
 
obj.foo();

 

 

주의할 점은 내부함수는 일반함수, 메소드, 콜백함수, 어디에서 선언되었던 관계없이 this는 전역객체를 바인딩합니다.

이런 구조를 피하는 방법은 아래와 같이 var that = this; 로 초기화해서 사용하면 됩니다.

var value = 1;
 
var obj = {
  value: 100,
  foo: function() {
    var that = this;  // Workaround : this === obj
 
    console.log("foo's this: ",  this);  // obj
    console.log("foo's this.value: ",  this.value); // 100
    function bar() {
      console.log("bar's this: ",  this); // window
      console.log("bar's this.value: ", this.value); // 1
 
      console.log("bar's that: ",  that); // obj
      console.log("bar's that.value: ", that.value); // 100
    }
    bar();
  }
};
 
obj.foo();

 

 

 

2-3) 생성자 함수 호출할 때의 this 바인딩

var Person = function(name) {
  this.name = name;
};
 
var kim = new Person("kim");
console.log(kim.name); //kim
 
var lee = new Person("lee");
console.log(lee.name); //lee

New를 통해 생성자 함수를 생성한 객체에 대해 바인딩이 됩니다.

 

 

 

 

반응형
저작자표시 변경금지 (새창열림)

'FrontEnd > ES&JS 문법' 카테고리의 다른 글

[알고리즘] 깊이우선탐색(dfs) / 넓이우선탐색(bfs) (feat.javascript)  (1) 2022.10.25
[Node.js] for 동기 처리(Promise, Mysql)  (0) 2022.10.21
[Javascript] 브라우저 동작 원리, 렌더링 트리  (0) 2022.10.19
[Javascript] 이벤트 버블링  (0) 2022.10.18
[Javascript] 이벤트 루프와 태스크 큐  (0) 2022.10.18
    'FrontEnd/ES&JS 문법' 카테고리의 다른 글
    • [알고리즘] 깊이우선탐색(dfs) / 넓이우선탐색(bfs) (feat.javascript)
    • [Node.js] for 동기 처리(Promise, Mysql)
    • [Javascript] 브라우저 동작 원리, 렌더링 트리
    • [Javascript] 이벤트 버블링
    기은P
    기은P
    기은P의 블로그 일상과 개발 관련 포스팅 #React #Typescript #Next #Nest https://github.com/kimdongjang

    티스토리툴바