본문 바로가기
공부 정리/웹(Web)

JS this

by 경적필패. 2022. 3. 18.
반응형

글 작성 동기?

this의 작동방식이 java와 다르다는 것은 알고 있었지만, 쓰다보면 익숙해질거라 생각하고 그냥 넘어갔지만, 한번 확실히 정리해두는게 좋겠다 싶어서 공부하여 글을 작성했습니다.

 

 

핵심

this바인딩은 함수 호출 방식에 의해 동적으로 결정된다.

즉 this를 어떻게 어디에 쓰느냐에 따라 다름!!

 

 

 

 

1.그냥 this

전역this

그냥 this를 사용할경우 전역객체인 window가 출력됩니다.

 

 

2.함수 안의 this

var val = 10;
var fun = function () {
  let val = 5;
  console.log(this.val);
};

fun();

해당 값은 결과가 10이 나옵니다. 즉 그냥 함수안에 쓰이면 전역객체에 연결됩니다.

("use strict" 사용하면 undefined)

 

 

3.메서드 안의 this

var value = 10;
const obj = {
  value: 100,
  fun: function () {
    console.log(this.value);
  },
};
obj.fun();

해당 결과 값은 100이 나옵니다. 메서드 안에서 this가 쓰이면 해당 메서드를 호출한 객체에 연결됩니다.

 

 

4.생성자 함수

var num = 10;
function Num(num) {
  this.num = num;
}
let a = new Num(5);
console.log(a.num); //5

생성자 함수에서는 생성자 함수가 생성하는 인스턴스에 연결됩니다.

 

 

5. bind함수 사용(es5)(출처 piemaweb)

function Person(name) {
  this.name = name;
  this.doSomething = function (callback) {
    callback();
  };
}

function foo() {
  console.log("#", this.name);
}

var p = new Person("Lee");
p.doSomething(foo); // undefined

이렇게 쓸경우 foo안의 this는 전역객체를 가리키기 때문에, undefined가 결과로 나옵니다.

 

그러나

function Person(name) {
  this.name = name;
  this.doSomething = function (callback) {
    callback.bind(this)();
  };
}

function foo() {
  console.log("#", this.name);
}

var p = new Person("Lee");
p.doSomething(foo); // LEE

bind를 이용해 인스턴스에 연결시켜주면 정상적으로 LEE가 나오게 됩니다.

 

 

 

 

 

반응형

'공부 정리 > 웹(Web)' 카테고리의 다른 글

CSR vs SSR 비교  (0) 2022.04.21
JS 배열 필수함수 (Array Function)  (0) 2022.03.25
JS preventDefault();  (0) 2022.03.16
JS .js 와 .mjs  (0) 2022.03.13
JS Primitive type checking  (0) 2022.03.10

댓글