μΌλ°˜ν•¨μˆ˜ VS ν™”μ‚΄ν‘œ ν•¨μˆ˜μ˜ this 바인딩

πŸ“ 일반 ν•¨μˆ˜

const foo = function () {
  console.log('일반 ν•¨μˆ˜');
}

πŸ“ ν™”μ‚΄ν‘œ ν•¨μˆ˜

const foo = () => console.log('ν™”μ‚΄ν‘œ ν•¨μˆ˜');
두 ν•¨μˆ˜λŠ” κΈ°λŠ₯적으둜 μ™„μ „νžˆ λ™μΌν•˜κ²Œ μž‘λ™ν•©λ‹ˆλ‹€.

JavaScript 일반 ν•¨μˆ˜μ˜ this 바인딩

const cat = {
  name: 'meow',
  foo1: function() {
    const foo2 = function() {
      console.log(this.name); // undefined
    }
    foo2();
  }
};

cat.foo1(); // undefined
        
  • 일반 ν•¨μˆ˜μ—μ„œ thisλŠ” ν•¨μˆ˜κ°€ 호좜될 λ•Œ ν•¨μˆ˜κ°€ μ–΄λ””μ—μ„œ ν˜ΈμΆœλ˜μ—ˆλŠ”μ§€μ— 따라 λ™μ μœΌλ‘œ κ²°μ •λ˜λ©°, 호좜된 μ»¨ν…μŠ€νŠΈμ— λ°”μΈλ”©λ©λ‹ˆλ‹€.
  • μ „μ—­μŠ€μ½”ν”„μ—μ„œ μ‹€ν–‰(μ„ μ–Έ)이 λ˜μ–΄ foo2 λ‚΄λΆ€μ˜ thisλŠ” μ§€μ •λ˜μ§€ μ•Šμ•„μ„œ κ³§ μ „μ—­ 객체λ₯Ό κ°€λ¦¬ν‚€κ²Œ λ©λ‹ˆλ‹€.
  • λ‚΄λΆ€ ν•¨μˆ˜μ˜ thisλŠ” μ „μ—­ 객체(window)λ₯Ό κ°€λ¦¬ν‚€λ―€λ‘œ μ „μ—­ 객체에 nameμ΄λž€ 속성은 μ‘΄μž¬ν•˜μ§€ μ•Šμ•„ undefined 좜λ ₯ λ©λ‹ˆλ‹€.
  • 이 λ‚΄λΆ€ν•¨μˆ˜κ°€ globalμ—μ„œλ„ μ œλŒ€λ‘œ μž‘λ™ν•˜κΈ° μœ„ν•΄μ„œ μš°λ¦¬λŠ” μ € λ‚΄λΆ€ν•¨μˆ˜μ— 객체의 thisλ₯Ό 바인딩 ν•  ν•„μš”κ°€ μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.

JavaScript ν™”μ‚΄ν‘œ ν•¨μˆ˜μ˜ this 바인딩

const cat = {
  name: 'meow',
  foo1: function() {
    const foo2 = () => {
      console.log(this.name);
    }
    foo2();
  }
};

cat.foo1(); // meow
μœ„ μ½”λ“œμ™€ 달라진 점은 cat 객체의 λ‚΄λΆ€ν•¨μˆ˜ foo2κ°€ ν™”μ‚΄ν‘œ ν•¨μˆ˜λ‘œ μ„ μ–Έλλ‹€λŠ” 점 λΏμž…λ‹ˆλ‹€. 그런데 μ΄λ²ˆμ—” μš°λ¦¬κ°€ μ˜λ„ν•œλŒ€λ‘œ meowκ°€ 잘 μ°ν˜”μŠ΅λ‹ˆλ‹€. μ–΄λ–»κ²Œ κ°€λŠ₯ν•œκ±ΈκΉŒμš”?

ν™”μ‚΄ν‘œ ν•¨μˆ˜μ—μ„œ thisλŠ” ν•¨μˆ˜κ°€ μ •μ˜λœ μŠ€μ½”ν”„μ—μ„œ μƒμ†λ©λ‹ˆλ‹€. (Lexical this) λ‚΄λΆ€ ν•¨μˆ˜μ˜ thisλŠ” μ™ΈλΆ€ ν•¨μˆ˜μ˜ thisλ₯Ό 상속받아 cat을 κ°€λ¦¬ν‚€λ―€λ‘œ meow 좜λ ₯ λ©λ‹ˆλ‹€.

addEventListener()의 μ½œλ°±ν•¨μˆ˜

μ›λž˜ addEventListener의 μ½œλ°±ν•¨μˆ˜μ—μ„œλŠ” this에 ν•΄λ‹Ή 이벀트 λ¦¬μŠ€λ„ˆκ°€ 호좜된 μ—˜λ¦¬λ¨ΌνŠΈκ°€ λ°”μΈλ”©λ˜λ„λ‘ μ •μ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  경우, 이미 this의 값이 μ •ν•΄μ Έ μžˆλŠ” μ½œλ°±ν•¨μˆ˜μ˜ 경우 κΈ°μ‘΄ 바인딩 값이 사라지고 μƒμœ„ μŠ€μ½”ν”„(이 κ²½μš°μ—” μ „μ—­ 객체)κ°€ λ°”μΈλ”©λ˜κΈ° λ•Œλ¬Έμ— μ˜λ„ν–ˆλ˜ λŒ€λ‘œ λ™μž‘ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. λ¬Όλ‘  μƒμœ„ μŠ€μ½”ν”„μ˜ 속성듀을 μ“°λ €κ³  μ˜λ„ν•œ 경우라면 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
const button = document.getElementById('myButton');

// ν™”μ‚΄ν‘œ ν•¨μˆ˜ μ‚¬μš© (λΉ„κΆŒμž₯)
button.addEventListener('click', () => {
  console.log(this); // Window
  this.innerHTML = 'clicked'; // μ „μ—­ 객체(window)의 innerHTML을 λ³€κ²½
});

// 일반 ν•¨μˆ˜ μ‚¬μš©
button.addEventListener('click', function() {
    console.log(this); // button μ—˜λ¦¬λ¨ΌνŠΈ
    this.innerHTML = 'clicked'; // ν•΄λ‹Ή λ²„νŠΌμ˜ innerHTML을 λ³€κ²½
});    
  • ν™”μ‚΄ν‘œ ν•¨μˆ˜μ˜ 경우, thisκ°€ ν•΄λ‹Ή 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό ν˜ΈμΆœν•œ λ¬Έλ§₯이 μ•„λ‹Œ μƒμœ„ μŠ€μ½”ν”„μ˜ thisλ₯Ό κ°€λ¦¬ν‚€λ―€λ‘œ λΉ„μΆ”μ²œν•©λ‹ˆλ‹€.
  • 일반 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ thisλŠ” ν•΄λ‹Ή μ΄λ²€νŠΈκ°€ λ°œμƒν•œ μ—˜λ¦¬λ¨ΌνŠΈλ₯Ό 가리킀며, λ²„νŠΌμ˜ innerHTML을 λ³€κ²½ν•˜λŠ” λ“±μ˜ μž‘μ—…μ΄ μ˜λ„ν•œ λŒ€λ‘œ λ™μž‘ν•©λ‹ˆλ‹€.
μœ„μ˜ μ˜ˆμ‹œμ—μ„œλŠ” ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  경우 thisκ°€ Windowλ₯Ό κ°€λ¦¬ν‚€λ―€λ‘œ λ²„νŠΌμ˜ innerHTML을 λ³€κ²½ν•˜λŠ” λ™μž‘μ΄ μ˜λ„μ™€ λ‹€λ¦…λ‹ˆλ‹€. λ”°λΌμ„œ 일반 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ½œλ°±ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λŠ” 것이 λ°”λžŒμ§ν•©λ‹ˆλ‹€.