Justinaus Blog

this

함수 내부에서 this의 값은 함수를 호출한 방법에 의해 동적으로 좌우됩니다.

그냥 함수로서 호출

function test() {
    console.log(this === window); // true.
}

test();

strict mode에서는 undefined.

function f2(){
  "use strict";
  return this;
}

f2() === undefined; // true

메서드로서 호출

함수를 어떤 객체의 메서드로 호출하면 this의 값은 그 객체를 사용합니다.

var o = {
    a: 3,
    test: function() {
        console.log(this.a); // this는 o.
    }
};

console.log(o.test()); // 3

생성자로서

함수를 new 키워드와 함께 생성자로 사용하면 this는 새로 생긴 객체에 묶입니다.

function Foo() {
  this.a = 37;
}

var o = new Foo();
console.log(o.a); // 37

call, bind, apply

this를 명시적으로 바인딩.

var obj = {a: 'Custom'};

var a = 'Global';

function whatsThis() {
  return this.a;  // The value of this is dependent on how the function is called
}

whatsThis();          // 'Global'
whatsThis.call(obj);  // 'Custom'
whatsThis.apply(obj); // 'Custom'

apply vs call

call() 은 함수에 전달될 인수 리스트를 받는데 비해, apply() 는 인수들의 단일 배열을 받는다는 점입니다.

bind

function f() {
  return this.a;
}

var g = f.bind({a: 'azerty'});
console.log(g()); // azerty

var h = g.bind({a: 'yoo'}); // bind는 한 번만 동작함!
console.log(h()); // azerty

화살표 함수

화살표 함수에서 this는 자신을 감싼 정적 범위 lexical context 입니다. 전역 코드에서는 전역 객체를 가리킵니다.

function Person(){
  this.age = 0;

  setInterval(() => {
    this.age++; // |this|는 Person 객체를 참조
  }, 1000);
}

var p = new Person();
'use strict';

var obj = { // does not create a new scope
  i: 10,
  b: () => console.log(this.i, this),
  c: function() {
    console.log( this.i, this)
  }
}
obj.b(); // prints undefined, Window {...} (or the global object)
obj.c(); // prints 10, Object {...}

화살표 함수는 call, apply, bind 메소드를 사용하여 this를 변경할 수 없다.


Justinaus

Written by Justinausgithub.com/justinaus