cbw1030
기록하는 공간
cbw1030
전체 방문자
오늘
어제
  • 전체보기 (101)
    • Programming (99)
      • Java (19)
      • Servlet (10)
      • Spring Framework (13)
      • Javascript (22)
      • AWS (2)
      • 네트워크 (8)
      • 데이터베이스 (13)
      • 리눅스 (3)
      • 블록체인 (7)
      • 용어 정리 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • web
  • react
  • 브라이틱스
  • javascript
  • 삼성SDS 브라이틱스
  • 인공지능
  • Brightics AI
  • 데이터 사이언스
  • 브라이틱스 스튜디오
  • Brightics Studio
  • 차원축소
  • 데이터분석
  • 생활코딩
  • 브라이틱스 튜토리얼
  • 브라이틱스 스튜디오 사용법
  • 크롤링
  • 삼성SDS
  • 머신러닝
  • beautifulsoup
  • Brightics

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
cbw1030

기록하는 공간

Programming/Javascript

[Javascript] this 이것은 무엇인가

2019. 2. 25. 16:48
반응형

this

자바스크립트에서는 함수를 호출하는 방식에 따라 this에 바인딩되는 객체가 달라진다.

다시 말해, 함수를 선언할 때 this에 바인딩할 객체가 정적으로 결정되는 것이 아니라, 함수를 호출할 때 함수가 어떻게 호출되었는지에 따라 this에 바인딩할 객체가 동적으로 결정된다


함수를 호출하는 방식은 4가지가 있다.

1. 함수 호출

2. 메소드 호출

3. 생성자 함수 호출 (추후에 포스팅 예정)

4. call/apply/bind 호출 (추후에 포스팅 예정)



1. 함수 호출

기본적으로 this는 전역객체에 바인딩한다. 

function foo() {

console.log(this);

}


foo(); // window

심지어 내부함수의 경우에도 this는 외부함수가 아닌 전역객체에 바인딩된다.

function foo() {

function goo() {

console.log(this);

}

goo();

}


foo() // window

메소드의 내부함수인 경우에도 this는 전역객체에 바인딩된다.

var a = 100;


var obj = {

a: 200,

foo: function() {

function goo() {

console.log(this.a);

}

goo();

}

};


obj.foo() // 100

콜백함수의 경우에도 this는 전역객체에 바인딩 된다.

var a = 100;


var obj = {

a: 200,

foo: function() {

setTimeout(function() {

console.log(this.a);

}, 1000);

}

}


obj.foo(); // 1초후 100 출력

내부함수는 일반함수, 메소드, 콜백함수 어디에도 선언되든 관계없이 this는 전역객체를 바인딩한다.


그렇다면 내부함수의 this가 전역객체를 참조하는 것을 피하려면 어떻게 해야할까? 

메소드의 내부함수를 지정하기 전에 that라는 변수를 지정해준다.

var a = 100;


var obj = function() {

a: 200,

foo: function() {

var that = this;

function goo() {

console.log(this.a); // 100


console.log(that.a); // 200


}

goo();

}

}


obj.foo();


2. 메소드 호출

함수가 객체의 프로퍼티 값이면 메소드로서 호출된다. 이때 메소드 내부의 this는 해당 메소드를 소유한 객체에 바인딩된다.

var obj1 = {

name: 'AAA',

sayName: function() {

console.log(this.name);

}

}


var obj2 = {

name: 'BBB'

}


obj2.sayName = obj1.sayName;


obj1.sayName(); // AAA


obj2.sayName(); // BBB



반응형
저작자표시

'Programming > Javascript' 카테고리의 다른 글

[Javascript] JSON.parse(), JSON.stringify()에 대해 알아보자  (0) 2019.03.05
[Javascript] ES6 템플릿 리터럴  (0) 2019.03.03
[Javascript] hoisting & scope 호이스팅과 스코프 (ES5, ES6 비교)  (0) 2019.02.25
[Javascript] insertAdjacentElement 함수에 대해 알아보자  (0) 2019.02.20
[Javascript] Rest 파라미터  (0) 2019.02.18
    'Programming/Javascript' 카테고리의 다른 글
    • [Javascript] JSON.parse(), JSON.stringify()에 대해 알아보자
    • [Javascript] ES6 템플릿 리터럴
    • [Javascript] hoisting & scope 호이스팅과 스코프 (ES5, ES6 비교)
    • [Javascript] insertAdjacentElement 함수에 대해 알아보자
    cbw1030
    cbw1030

    티스토리툴바