this - ChoDragon9/posts GitHub Wiki

์ถœ์ฒ˜ : [๋‹ˆ์ฝœ๋ผ์Šค ์ž์นด์Šค] ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๊ธ€์˜ ๋ชฉ์ 

ES5์—์„œ this๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด์„œ๋Š” this์— ๋Œ€ํ•œ ๊นŠ์€ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋ŸฐํŠธ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๊ธฐ์ˆ ๋ฉด์ ‘์‹œ ์งˆ๋ฌธ์„ ๋ฐ›์•„๋ดค์„ ๋งŒํ•œ ๋‹จ๊ณจ ๋ฌธ์ œ์ด๊ธฐ๋„ ํ•˜๋‹ค. ์ด ๊ธ€์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž…๋ฌธํ•  ๋•Œ ํ•˜๋‚˜์˜ ์‚ฐ์ด ์—ˆ๋˜ this๋ฅผ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ด๋‹ค.

this๋ž€

this๋ž€ ํ˜ธ์ถœ๋ถ€์˜ ์ฐธ์กฐ์ด๋‹ค. ํ˜ธ์ถœ๋ถ€์˜ ์ฐธ์กฐ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋„ค๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

์ฒซ๋ฒˆ์งธ, ๋‹จ๋… ํ•จ์ˆ˜ ์‹คํ–‰ ํ•  ๊ฒฝ์šฐ ์ „์—ญ ๊ฐ์ฒด๊ฐ€ ๊ธฐ๋ณธ ๋ฐ”์ธ๋”ฉ์ด ๋œ๋‹ค.

์ „์—ญ์—์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ํ•จ์ˆ˜๊ฐ€ this๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ์ „์—ญ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

function foo() {
  console.log(this.a);
}
var a = 'Hello World';
foo(); // Hello World

๋‘๋ฒˆ์งธ, ํ˜ธ์ถœ๋ถ€์— ์ฝ˜ํ…์ŠคํŠธ ๊ฐ์ฒด๊ฐ€ ์žˆ์„ ๋•Œ, ๊ฐ์ฒด๊ฐ€ ์•”์‹œ์  ๋ฐ”์ธ๋”ฉ์„ ํ•œ๋‹ค.

ํ•จ์ˆ˜(์ •ํ™•ํžˆ๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค)๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๊ฐ์ฒด๊ฐ€ ์žˆ์œผ๋ฉด ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

function foo () {
  console.log(this.a);
}
const obj = {
  a: 2019,
  foo
};
obj.foo(); // 2019

๊ฐ์ฒด ๋ฉ”์†Œ๋“œ๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹น ํ›„ ํ˜ธ์ถœํ•˜๋ฉด ์•”์‹œ์  ์†Œ์‹ค์ด ๋œ๋‹ค.

const myFoo = obj.foo;
myFoo(); // undefined

์„ธ๋ฒˆ์งธ, call, apply, bind๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ์ด ๋œ๋‹ค.

ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋ช…์‹œ์ ์œผ๋กœ this๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€๋ฅผ ์ •์˜ํ•˜๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ this๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

function foo () {
  console.log(this.a);
}
const obj = { a: 2019 };
foo.call(obj); // 2019
foo.apply(obj); // 2019
foo.bind(obj)(); // 2019

๋„ค๋ฒˆ์งธ, new๋ฅผ ๋ถ™์—ฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ this ๋ฐ”์ธ๋”ฉํ•œ๋‹ค.

function foo () {
  setTimeout(() => {
    console.log(this.a); // 2019
  });
}
const bar = new foo();
bar.a = 2019;

ES6์—์„œ this

ES6๋ถ€ํ„ฐ๋Š” ์ด ๊ทœ์น™๋“ค์„ ๋”ฐ๋ฅด์ง€ ์•Š๋Š” ํŠน๋ณ„ํ•œ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ๋ฐ”๋กœ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ผ๊ณ  ํ•˜๋ฉฐ, 4๊ฐ€์ง€ ํ‘œ์ค€ ๊ทœ์น™ ๋Œ€์‹ ์— ๋‘๋ฅธ ์Šค์ฝ”ํ”„(Enclosing Scope)๋ฅผ ๋ณด๊ณ  this๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค.

๊ณตํ†ต HTML ์ฝ”๋“œ

<button>0</button>

ES5

var app = {
  count: 0,
  init: function () {
    document.querySelector('button')
      .addEventListener('click', this.upCount.bind(this))
  },
  upCount: function () {
    this.count++
    this.render()
  },
  render: function () {
    document.querySelector('button')
      .textContent = this.count
  }
}
app.init()

ES6

const app = {
  count: 0,
  init() {
    document.querySelector('button')
      .addEventListener('click', () => {
        this.upCount()
      })
  },
  upCount() {
    this.count++
    this.render()
  },
  render() {
    document.querySelector('button')
      .textContent = this.count
  }
}
app.init()
โš ๏ธ **GitHub.com Fallback** โš ๏ธ