UX Engineer 이명종

자바스크립트 코어 - this

자바스크립트 코어 - this

목차

this

상황에 따라 달라지는 this

실행 컨텍스트 - 실행할 코드에 제공할 환경 정보들을 모아놓은 객체

1. 전역 공간에서의 this

2. 메서드로서 호출할 때 그 메서드 내부에서의 this

var test = function () {
  console.log("CALL TEST()");
  console.log(this);
};

test(); // 함수로서 호출, this에 전역객체 호출

var object = {
  a: 1,
  test: test,
};

object.test(); // 메서드로서 호출, this에 object가 들어간다.

3. 함수로서 호출할 때 그 함수 내부에서의 this

메서드의 내부 함수에서 this 우회하기

var test = {
  method_func: function () {
    console.log(this); // Method. Object를 바라본다.

    var func1 = function () {
      // 함수
      console.log(this); // 전역객체를 바라본다.
    };

    var self = this; // self에 this를 할당
    var func2 = function () {
      console.log(self); // 내부 함수 안에서 this를 사용할 수 있다.
    };
    func1();
    func2();
  },
  var1: 10,
  var2: 20,
};
test.method_func();

4. 콜백함수 호출 시 그 함수 내부에서의 this

setTimeout(function () {
  console.log(this);
}, 300); // 전역객체

[1, 2, 3, 4, 5].forEach(function (x) {
  console.log(this, x); // 전역객체와 배열요소가 5회출력
});

document.body.innerHTML += '<button id="a">클릭</button>';
document.body.querySelector("#a").addEventListener("click", function (e) {
  console.log(this, e); // 버튼 엘리먼트와 클릭 이벤트에 관한 객체가 출력
});

명시적으로 this를 바인딩하는 방법

1. call 메서드

Function.prototype.call(thisArg[, arg1[, arg2[, ...]]])
var func = function () {
  console.log(this);
};

func(); // 전역객체가 찍힌다.
func.call({ a: 10, b: 20 }); // { a: 10, b: 20 }

2. apply 메서드

Function.prototype.apply(thisArg[, argsArray])
var func = function(a, b, c) {
  console.log(this, a, b, c);
};
func.apply({ x: 1 }, [4, 5, 6]); // { x: 1 } 4 5 6

var obj = {
  a: 1,
  method: function(x, y) {
    console.log(this.a, x, y);
  },
};
obj.method.apply({ a: 4 }, [5, 6]); // 4 5 6

3. bind 메서드

Function.prototype.bind(thisArg[, arg1[, arg2[, ...]]])
var func = function(a, b, c, d) {
  console.log(this, a, b, c, d);
};
func(1, 2, 3, 4); // Window{ ... } 1 2 3 4

var bindFunc1 = func.bind({ x: 1 }); // bind는 this만을 지정
bindFunc1(5, 6, 7, 8); // { x: 1 } 5 6 7 8

var bindFunc2 = func.bind({ x: 1 }, 4, 5); // this 지정과 함께 부분 적용 함수
bindFunc2(6, 7); // { x: 1 } 4 5 6 7
bindFunc2(8, 9); // { x: 1 } 4 5 8 9

console.log(bindFunc2.name); // bound func

화살표 함수의 예외사항

정리


Share this: