์‹œ์ž‘ํ•˜๋ฉฐ

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๊ณผ์ œ๊ด€์— ์žˆ๋Š” ๊ณ ์–‘์ด ์‚ฌ์ง„ ๊ฒ€์ƒ‰ ์‚ฌ์ดํŠธ ๊ณผ์ œ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ JavaScript ๋ฉด์ ‘ ์งˆ๋ฌธ์œผ๋กœ ์ž์ฃผ ๋งŒ๋‚˜๋Š” ๊ฐœ๋…์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

JavaScript

this

๊ธฐ๋ณธ ๋ฐ”์ธ๋”ฉ (์ „์—ญ๊ฐ์ฒด)

์ผ๋ฐ˜์ ์œผ๋กœ this๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ™˜๊ฒฝ์˜ ์ „์—ญ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. (๋ธŒ๋ผ์šฐ์ €์˜ window ๊ฐ์ฒด)
this์˜ ์ฒซ๋ฒˆ์งธ ๋™์ž‘ ๋ฐฉ์‹์€ ์ „์—ญ ๊ฐ์ฒด(window)๋ฅผ context ๊ฐ์ฒด๋กœ ๊ฐ–๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

์•”์‹œ์  ๋ฐ”์ธ๋”ฉ

function zzz() {
  console.log(this.a);
}

var foo = {
  a: 20,
  bar: zzz,
  bla: function() {
    console.log(this.a);
  }
}

foo.bar() // 20
foo.bla() // 20

์–ด๋–ค ๊ฐ์ฒด(foo)๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค๋ฉด ์ด๋•Œ์˜ this์˜ context ๊ฐ์ฒด๋Š” ํ˜ธ์ถœํ•œ ์–ด๋–ค ๊ฐ์ฒด(foo)์ž…๋‹ˆ๋‹ค.

var b = 100;

this.blabla = foo.bar;
this.blabla(); // 100

์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ์˜ ์ „์—ญ ์Šค์ฝ”ํ”„์— ์œ„ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๋ฉด this์˜ context ๊ฐ์ฒด๋Š” ๋‹ค์‹œ ์ „์—ญ ๊ฐ์ฒด(window)๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
์ „์—ญ ์Šค์ฝ”ํ”„์—์„œ ์ƒ์„ฑํ•œ ๋ณ€์ˆ˜๋Š” ์ „์—ญ ๊ฐ์ฒด์— ๋“ฑ๋ก๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ

function foo() {
  console.log(this);
}

var obj = { name: 'jigeol' };
foo.call(obj);

call() ๋ฉ”์„œ๋“œ๋Š” ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ๊ฒƒ์ด this context ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ด ์™ธ์—๋„ apply, bind ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด this context ๊ฐ์ฒด๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์„ ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

new ๋ฐ”์ธ๋”ฉ

function foo(a) {
  this.a = a;
  this.b = 20;
}

var bar = new foo(2);

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ new ํ‚ค์›Œ๋“œ๋Š” ์ž๋ฐ”์˜ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค ํ™”๊ฐ€ ์•„๋‹ˆ๋ผ foo ํ•จ์ˆ˜ ์‹คํ–‰๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฐ”์ธ๋”ฉ์˜ ์šฐ์„  ์ˆœ์œ„

new ๋ฐ”์ธ๋”ฉ >= ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ >>>> ์•”์‹œ์  ๋ฐ”์ธ๋”ฉ >= ๊ธฐ๋ณธ ๋ฐ”์ธ๋”ฉ

๊ธฐ๋ณธ ๋ฐ”์ธ๋”ฉ์€ new ๋ฐ”์ธ๋”ฉ, ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ, ์•”์‹œ์  ๋ฐ”์ธ๋”ฉ ์ผ€์ด์Šค๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ๋ฐœ์ƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

new ๋ฐ”์ธ๋”ฉ & ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ VS ์•”์‹œ์  ๋ฐ”์ธ๋”ฉ

function foo(bar) {
  this.a = bar;
}

var obj1 = {
  foo: foo
}

obj1.foo(2) // ์•”์‹œ์  ๋ฐ”์ธ๋”ฉ
console.log(obj1.a) // 2

var obj2 = {};

obj1.foo.call(obj2, 3); // ์•”์‹œ์  ๋ฐ”์ธ๋”ฉํ•œ ํ›„ obj2๋ผ๊ณ  ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ
console.log(obj1.a) // 2
console.log(obj2.a) // 3

var obj3 = new obj1.foo(10) // new ๋ฐ”์ธ๋”ฉ
console.log(obj1.a) // 2
console.log(obj2.a) // 3
console.log(obj3.a) // 10

์•”์‹œ์  ๋ฐ”์ธ๋”ฉ ํ•œ ๊ฐ์ฒด(obj1)๋ฅผ ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ & new๋ฐ”์ธ๋”ฉ์„ ํ•ด๋ณด์•„๋„ obj1 ๊ฐ์ฒด์˜ ๊ฐ’์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋“ค(obj2, obj3)์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

new ๋ฐ”์ธ๋”ฉ VS ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ

function foo(something) {
  this.a = something;
}

var obj1 = {};

var bar = foo.bind(obj1); // ๋ช…์‹œ์  ๋ฐ”์ธ๋”ฉ
bar(2);
console.log(obj1.a); // 2

var baz = new bar(3); // new ๋ฐ”์ธ๋”ฉ
console.log(obj1.a); // 2
console.log(baz.a); // 3

Arrow Function

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ํ‘œํ•œํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•์—์„œ์˜ this๋Š” ํŠน๋ณ„ํ•˜๊ฒŒ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค.
ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ์Šค์ฝ”ํ”„์˜ this context ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

var a = 10;
var b = 20;
var obj = {
  a: 1,
  func: () => console.log(this.a)
}

obj.func(); // 10

// Arror Function
function test() {
  console.log(this);
  return () => console.log(this.b);
}

var f1 = test();
f1(); // 20
var context = { b: 999 };
var f2 = test.call(context);
f2(); // 999

// function()
function test2() {
  console.log(this);
  return funtion() {
    console.log(this.b);
  }
}

var f3 = test2();
f3(); // 20
var f4 = test2.call(context);
f4(); // 20

์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง & ์ด๋ฒคํŠธ ์บก์ณ๋ง

addEventListener

๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฒคํŠธ๋Š” ํ•˜์œ„์š”์†Œ์—์„œ๋ถ€ํ„ฐ ์ƒ์œ„์š”์†Œ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

<section class="container">
  <div class="inner">
    <button class="close">๋ฒ„ํŠผ์ด์—์šฉ</button>
  </div>
</section>
document.getElementsByClassName("container").addEventListener('click', () => {
  console.log("I'm container!");
})

document.getElementsByClassName("inner").addEventListener('click', () => {
  console.log("I'm inner!");
})

document.getElementsByClassName("close").addEventListener('click', () => {
  console.log("I'm close button!");
})

์œ„ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ˜์†”์˜ ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

I'm close button!
I'm inner!
I'm container!

addEventListener๋Š” ์„ธ๋ฒˆ์งธ ์ธ์ž๋กœ useCapture๋ผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์œผ๋ก  false์ด๊ณ  ์บก์ณ๋ง์„ ์‚ฌ์šฉํ• ๊ฑด์ง€๋ฅผ ์„ค์ •ํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์ž…๋‹ˆ๋‹ค. ์œ„ ์ฝ”๋“œ ์ค‘ ์ด๋ ‡๊ฒŒ๋งŒ ๋ฐ”๊พผ๋‹ค๋ฉด?

document.getElementsByClassName("container").addEventListener('click', () => {
  console.log("I'm container!");
}, true)

๊ฒฐ๊ณผ๋Š” ์ด๋ ‡์Šต๋‹ˆ๋‹ค.

I'm container!
I'm close button!
I'm inner!