๐Ÿ’ป FE/๐Ÿ“ JS

๋ฐ”๋‹๋ผ JS ํด๋ž˜์Šค ์‚ฝ์งˆ ๊ธฐ๋ก: ์„ค๊ณ„๋ถ€ํ„ฐ this์™€์˜ ์”จ๋ฆ„๊นŒ์ง€

Roy Miller 2025. 4. 6. 12:52

1. ์™œ ํด๋ž˜์Šค?

  • ๋‹จ์ˆœ ํ•จ์ˆ˜์™€ ์ „์—ญ ๋ณ€์ˆ˜: ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜์ง€๋งŒ, ์—ฌ๋Ÿฌ ์นด์šดํ„ฐ๋ฅผ ๋งŒ๋“ค ๊ฒฝ์šฐ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ  ๋ณ€์ˆ˜ ์ด๋ฆ„ ์ถฉ๋Œ์ด๋‚˜ ์Šค์ฝ”ํ”„ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ธฐ ์‰ฌ์› ๋‹ค.
  • ํด๋กœ์ €(Closure) ํ™œ์šฉ: ํด๋กœ์ €๋ฅผ ์ด์šฉํ•ด ์ƒํƒœ๋ฅผ ์ˆจ๊ธฐ๊ณ  ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜ ํŒจํ„ด๋„ ๊ฐ€๋Šฅํ–ˆ๋‹ค. ์ƒํƒœ๋ฅผ ๋น„๊ณต๊ฐœ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ, ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ๋งˆ๋‹ค ํ•จ์ˆ˜๋“ค์ด ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๋Š” ์ , ๊ทธ๋ฆฌ๊ณ  'ํ‹€'๋กœ์„œ์˜ ๋ช…ํ™•์„ฑ์ด ํด๋ž˜์Šค๋ณด๋‹ค๋Š” ๋ถ€์กฑํ•˜๋‹ค๊ณ  ๋А๊ปด์กŒ๋‹ค.
  • ES5 ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ ํ”„๋กœํ† ํƒ€์ž…: new ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ์ „ํ†ต์ ์ธ ๋ฐฉ์‹์ด๋‹ค. ํด๋ž˜์Šค์™€ ๊ฐ€์žฅ ์œ ์‚ฌํ•˜์ง€๋งŒ, prototype์„ ์ง์ ‘ ๋‹ค๋ค„์•ผ ํ•ด์„œ ๋ฌธ๋ฒ•์ด ๋‹ค์†Œ ๋ฒˆ๊ฑฐ๋กญ๊ณ  ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง„๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

์ด๋Ÿฐ ์ ๋“ค์„ ๊ณ ๋ คํ–ˆ์„ ๋•Œ, ES6์˜ class ๋ฌธ๋ฒ•์ด ๊ด€๋ จ ๋ฐ์ดํ„ฐ(์ƒํƒœ)์™€ ๊ธฐ๋Šฅ(๋ฉ”์„œ๋“œ)์„ ํ•˜๋‚˜์˜ '์„ค๊ณ„๋„'์ฒ˜๋Ÿผ ๋ฌถ์–ด์ฃผ๊ณ , new ํ‚ค์›Œ๋“œ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์ด ๊ฐ€์žฅ ์ง๊ด€์ ์ด๊ณ  ๊ตฌ์กฐ์ ์œผ๋กœ ๋ณด์˜€๋‹ค. ์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚ด๊ณ , ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ๊ฐœ๋…์„ ์ ์šฉํ•˜๊ธฐ์—๋„ ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

2. ์นด์šดํ„ฐ ํด๋ž˜์Šค ๊ตฌ์ƒํ•˜๊ธฐ (์„ค๊ณ„ ๋‹จ๊ณ„)

ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๊ณ , ๊ตฌ์ฒด์ ์œผ๋กœ ์นด์šดํ„ฐ ์ปดํฌ๋„ŒํŠธ์— ํ•„์š”ํ•œ ์š”์†Œ๋“ค์„ ์„ค๊ณ„ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

  • ํ•ต์‹ฌ ๋ฐ์ดํ„ฐ (Properties):
    • count: ํ˜„์žฌ ์ˆซ์ž ๊ฐ’์„ ์ €์žฅํ•  ๋‚ด๋ถ€ ์ƒํƒœ. ์ดˆ๊ธฐ๊ฐ’์€ 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
    • displayElement: ์นด์šดํ„ฐ ๊ฐ’์„ ํ‘œ์‹œํ•  ์™ธ๋ถ€ DOM ์š”์†Œ. ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ๋ฐ›์•„์™€์•ผ ํ•œ๋‹ค.
    • incrementButton: ์นด์šดํ„ฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ฌ ๋ฒ„ํŠผ DOM ์š”์†Œ. ์ด๊ฒƒ๋„ ์™ธ๋ถ€์—์„œ ๋ฐ›์•„์˜จ๋‹ค.
    • (์ถ”๊ฐ€ ๊ณ ๋ ค) decrementButton: ๊ฐ์†Œ ๊ธฐ๋Šฅ๋„ ๋„ฃ๋Š”๋‹ค๋ฉด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค. (์ด๋ฒˆ์—” ์ฆ๊ฐ€๋งŒ ๊ตฌํ˜„ํ•˜๊ธฐ๋กœ ํ•จ)
  • ํ•ต์‹ฌ ๊ธฐ๋Šฅ (Methods):
    • increment(): count ์†์„ฑ ๊ฐ’์„ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
    • updateDisplay(): ํ˜„์žฌ count ๊ฐ’์„ displayElement์˜ ํ…์ŠคํŠธ ๋‚ด์šฉ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•œ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” increment ๋‚ด๋ถ€์—์„œ๋„ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๊ณ , ์ดˆ๊ธฐํ™” ์‹œ์ ์—๋„ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • ์ดˆ๊ธฐ ์„ค์ • (Constructor):
    • displayElement์™€ incrementButton์„ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค.
    • ๋ฐ›์•„์˜จ DOM ์š”์†Œ๋“ค์„ ํด๋ž˜์Šค ๋‚ด๋ถ€ ์†์„ฑ(e.g., this.displayElement)์— ํ• ๋‹นํ•œ๋‹ค.
    • count ์†์„ฑ์„ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
    • ์ดˆ๊ธฐ ํ™”๋ฉด ํ‘œ์‹œ๋ฅผ ์œ„ํ•ด this.updateDisplay()๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
    • ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ํด๋ฆญ ์‹œ this.increment ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ์—ฐ๊ฒฐํ•œ๋‹ค. (์ด ๋ถ€๋ถ„์—์„œ this ๋ฌธ์ œ๊ฐ€ ์˜ˆ์ƒ๋˜์—ˆ๋‹ค.)

์ฒ˜์Œ์—๋Š” ๋‹จ์ˆœํžˆ ๊ธฐ๋Šฅ๋งŒ ๋‚˜์—ดํ–ˆ๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ์†์„ฑ(๋ฐ์ดํ„ฐ)๊ณผ ๋ฉ”์„œ๋“œ(๊ธฐ๋Šฅ), ๊ทธ๋ฆฌ๊ณ  ์ƒ์„ฑ์ž(์ดˆ๊ธฐํ™”)๋กœ ๋‚˜๋ˆ„์–ด ์ƒ๊ฐํ•˜๋‹ˆ ํด๋ž˜์Šค์˜ ๊ตฌ์กฐ๊ฐ€ ๋” ๋ช…ํ™•ํ•ด์กŒ๋‹ค.

3. ๊ตฌํ˜„ ์‹œ์ž‘: constructor์™€ ์ฒซ this์˜ ๋ฒฝ

์„ค๊ณ„๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ์ƒ์„ฑ์ž์—์„œ ์™ธ๋ถ€ ์š”์†Œ๋ฅผ ๋ฐ›์•„์™€ ๋‚ด๋ถ€ ์†์„ฑ์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ ์ž์ฒด๋Š” ์–ด๋ ต์ง€ ์•Š์•˜๋‹ค.

JavaScript
 
class Counter {
  constructor(displayEl, buttonEl) {
    // ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •
    this.count = 0; 
    
    // ์ „๋‹ฌ๋ฐ›์€ DOM ์š”์†Œ๋ฅผ ๋‚ด๋ถ€ ์†์„ฑ์— ํ• ๋‹น
    // 'this'๋Š” ์ƒ์„ฑ๋  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
    this.displayElement = displayEl; 
    this.buttonElement = buttonEl;

    console.log('Counter ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ๋จ:', this); // ๋””๋ฒ„๊น…: this ํ™•์ธ

    // ์ดˆ๊ธฐ ํ™”๋ฉด ์—…๋ฐ์ดํŠธ (๋ฉ”์„œ๋“œ ํ˜ธ์ถœ)
    this.updateDisplay(); 

    // ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ this ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ ์ธ์ง€
    this.buttonElement.addEventListener('click', /* ??? */);
  }

  // ๋ฉ”์„œ๋“œ ์ •์˜...
  increment() {
    this.count++;
    console.log('Incrementing count to:', this.count); // ๋””๋ฒ„๊น…
    this.updateDisplay(); 
  }

  updateDisplay() {
    console.log('Updating display with count:', this.count); // ๋””๋ฒ„๊น…
    this.displayElement.textContent = this.count; 
  }
}

์—ฌ๊ธฐ๊นŒ์ง€๋Š” ๊ดœ์ฐฎ์•˜๋‹ค. this๊ฐ€ ์ƒˆ๋กœ ์ƒ์„ฑ๋  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค๋Š” ์ ๋งŒ ์ดํ•ดํ•˜๋ฉด ๋๋‹ค. ๋ฌธ์ œ๋Š” ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ๋ฐœ์ƒํ–ˆ๋‹ค.

4. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์™€ this์˜ ์žฌ์•™, ๊ทธ๋ฆฌ๊ณ  ํ•ด๊ฒฐ ๊ณผ์ •

๊ฐ€์žฅ ํฐ ๋‚œ๊ด€์€ ์—ญ์‹œ this์˜€๋‹ค. ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ increment ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ์•„๋ž˜์ฒ˜๋Ÿผ ์—ฐ๊ฒฐํ–ˆ๋”๋‹ˆ ์˜ˆ์ƒ๋Œ€๋กœ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

JavaScript
 
// ๋ฌธ์ œ์˜ ์ฝ”๋“œ (constructor ๋‚ด๋ถ€)
this.buttonElement.addEventListener('click', this.increment); 

๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด increment ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธด ํ•˜์ง€๋งŒ, ๊ทธ ์•ˆ์—์„œ this๊ฐ€ Counter ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ this.buttonElement (์ฆ‰, ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ ๋ฒ„ํŠผ ์š”์†Œ)๋ฅผ ๊ฐ€๋ฆฌ์ผฐ๋‹ค. ์™œ๋ƒํ•˜๋ฉด addEventListener์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ๋ฉ”์„œ๋“œ๊ฐ€ ์ „๋‹ฌ๋  ๋•Œ, ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์˜ ์ฃผ์ฒด(context)๊ฐ€ Counter ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฒ„ํŠผ ์š”์†Œ ์ž์ฒด๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ increment ๋‚ด๋ถ€์˜ this.count++๋‚˜ this.updateDisplay()๋Š” ๋ฒ„ํŠผ ์š”์†Œ์— count ์†์„ฑ์ด๋‚˜ updateDisplay ๋ฉ”์„œ๋“œ๋ฅผ ์ฐพ์œผ๋ ค๋‹ค ์‹คํŒจํ•˜๊ณ  ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œ์ผฐ๋‹ค (TypeError).

์ด๊ฑธ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด increment ๋ฉ”์„œ๋“œ ๋งจ ์œ„์— console.log('this in increment:', this); ๋ฅผ ๋„ฃ์–ด๋ณด๋‹ˆ ๋ช…ํ™•ํžˆ ๋ฒ„ํŠผ ์š”์†Œ๊ฐ€ ์ถœ๋ ฅ๋˜์—ˆ๋‹ค.

ํ•ด๊ฒฐ์ฑ… 1: Function.prototype.bind()

bind ๋ฉ”์„œ๋“œ๋Š” ํ˜ธ์ถœ๋  ๋•Œ์˜ this ๊ฐ’์„ ํŠน์ • ๊ฐ์ฒด๋กœ ๊ณ ์ •ํ•œ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๊ฑธ ์‚ฌ์šฉํ•˜๋ฉด increment ๋‚ด๋ถ€์˜ this๊ฐ€ ํ•ญ์ƒ Counter ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

JavaScript
 
// ํ•ด๊ฒฐ ์ฝ”๋“œ 1 (constructor ๋‚ด๋ถ€)
this.buttonElement.addEventListener('click', this.increment.bind(this)); 
// this.increment ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋˜, ๋‚ด๋ถ€์˜ 'this'๋Š” ํ•ญ์ƒ ํ˜„์žฌ Counter ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๋ฌถ์Œ

ํ•ด๊ฒฐ์ฑ… 2: ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ (ํด๋ž˜์Šค ํ•„๋“œ ๋ฌธ๋ฒ• ํ™œ์šฉ)

๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ๋•Œ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ์ž์‹ ๋งŒ์˜ this๋ฅผ ๊ฐ–์ง€ ์•Š๊ณ  ์ž์‹ ์„ ๋‘˜๋Ÿฌ์‹ผ ์™ธ๋ถ€ ์Šค์ฝ”ํ”„(์—ฌ๊ธฐ์„œ๋Š” constructor ๋˜๋Š” ํด๋ž˜์Šค ์ž์ฒด)์˜ this๋ฅผ ๊ทธ๋Œ€๋กœ ์ƒ์†๋ฐ›๋Š”๋‹ค. ์ฆ‰, Counter ์ธ์Šคํ„ด์Šค๋ฅผ this๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๊ฑธ ์‚ฌ์šฉํ•˜๋ฉด bind ์—†์ด๋„ ๊น”๋”ํ•˜๊ฒŒ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค. (๋‹จ, ํด๋ž˜์Šค ํ•„๋“œ ๋ฌธ๋ฒ•์€ ๋น„๊ต์  ์ตœ์‹  ์ŠคํŽ™์ด๋ฏ€๋กœ ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ ํ™•์ธ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค.)

JavaScript
 
class CounterWithArrowFn {
  constructor(displayEl, buttonEl) {
    this.count = 0;
    this.displayElement = displayEl;
    this.buttonElement = buttonEl;
    this.updateDisplay();

    // ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋Š” this๊ฐ€ ์ž๋™์œผ๋กœ ๋ฐ”์ธ๋”ฉ๋จ
    this.buttonElement.addEventListener('click', this.increment); 
  }

  // ๋ฉ”์„œ๋“œ๋ฅผ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ์ •์˜
  increment = () => {
    this.count++;
    // ์ด ์•ˆ์˜ this๋Š” ํ•ญ์ƒ Counter ์ธ์Šคํ„ด์Šค
    this.updateDisplay(); 
  }

  updateDisplay = () => {
    this.displayElement.textContent = this.count;
  }
}

๋‘ ๋ฐฉ๋ฒ• ๋ชจ๋‘ ์œ ํšจํ–ˆ์ง€๋งŒ, ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋ฐฉ์‹์ด ์ฝ”๋“œ๊ฐ€ ๋” ๊ฐ„๊ฒฐํ•ด ๋ณด์˜€๋‹ค. this ๋ฌธ์ œ ํ•˜๋‚˜ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์™€ ํ•จ์ˆ˜์˜ ๋™์ž‘ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๊นŠ์€ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค.

5. ๋ฐฐ์šด ์  ์ •๋ฆฌ

์ด๋ฒˆ ๋ฐ”๋‹๋ผ JS ํด๋ž˜์Šค ๊ตฌํ˜„ ๊ฒฝํ—˜์„ ํ†ตํ•ด ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ ์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

  • ํด๋ž˜์Šค๋Š” ๊ด€๋ จ ๋ฐ์ดํ„ฐ์™€ ๊ธฐ๋Šฅ์„ ์บก์Аํ™”ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๊ตฌ์กฐํ™”ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค.
  • ํด๋ž˜์Šค ์„ค๊ณ„ ๋‹จ๊ณ„์—์„œ ํ•„์š”ํ•œ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฏธ๋ฆฌ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ๊ตฌํ˜„์— ๋„์›€์ด ๋œ๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ this๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ๊ฒฐ์ •๋˜๋ฏ€๋กœ, ํŠนํžˆ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • bind๋‚˜ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์„œ๋“œ ๋‚ด์˜ this ์ปจํ…์ŠคํŠธ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.