B10 : ํ•จ์ˆ˜์˜ this ํ‚ค์›Œ๋“œ

2025. 8. 16. 15:35ใ†Front-end/JavaScript

๋ฐ˜์‘ํ˜•

๋ชฉ์ฐจ

1. this ํ‚ค์›Œ๋“œ๋ž€?

2. ํ•จ์ˆ˜ ๋‹จ์ˆœ ํ˜ธ์ถœ์—์„œ์˜ this

3. ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์—์„œ์˜ this

4. ์ƒ์„ฑ์ž ํ˜ธ์ถœ์—์„œ์˜ this

5. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์—์„œ์˜ this


1. this ํ‚ค์›Œ๋“œ๋ž€?

ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋ฌธ๋งฅ(context)๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํ‚ค์›Œ๋“œ์ด๋‹ค.

 

๊ธฐ๋ณธ ๊ฐœ๋…

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰ ์ปจํ…์ŠคํŠธ (Execution Context)๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
  • ์ด ์ปจํ…์ŠคํŠธ ์•ˆ์—๋Š” this๊ฐ€ ์ž๋™์œผ๋กœ ๋“ค์–ด๊ฐ€๋Š”๋ฐ, ๊ฐ’์ด ๊ณ ์ •๋˜์–ด ์žˆ์ง€ ์•Š๊ณ  ํ˜ธ์ถœ ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค.

ํŠน์ง•

  • ์ฝ๊ธฐ ์ „์šฉ : ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๊ณ , call(). apply(), bind()๋“ฑ์˜ ๋‚ด์žฅ ํ•จ์ˆ˜๋กœ ๊ฐ„์ ‘ ์ œ์–ด๋งŒ ๊ฐ€๋Šฅ
  • ๋Ÿฐํƒ€์ž„์—์„œ ๊ฒฐ์ •๋จ : ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋  ๋•Œ๊ฐ€ ์•„๋‹Œ ํ˜ธ์ถœ๋  ๋•Œ ๋ฌด์—‡์„ ์ฐธ์กฐํ•  ์ง€ ๊ฒฐ์ •
  • ํ˜ธ์ถœ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

๊ทธ๋Ÿผ ํ˜ธ์ถœ ๋ฐฉ๋ฒ•์—๋Š” ์–ด๋–ค ๊ฒƒ๋“ค์ด ์žˆ๋Š”์ง€, ์–ด๋–ป๊ฒŒ ๋‹ฌ๋ผ์ง€๋Š”์ง€ ์•Œ์•„๋ณด์ž.


2. ํ•จ์ˆ˜ ๋‹จ์ˆœ ํ˜ธ์ถœ์—์„œ์˜ this

ํ•จ์ˆ˜๋ฅผ ๋‹จ์ˆœ ํ˜ธ์ถœ ํ•  ๋•Œ this๋Š” ํ•ญ์ƒ ์ „์—ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

*์ „์—ญ ์‹คํ–‰๋ฌธ์—์„œ, ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ๋“ฑ๋“ฑ..

*์ „์—ญ ์‹คํ–‰๋ฌธ : JS ์—”์ง„์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ฒ˜์Œ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๋ฌธ

// 1. ๋น„์—„๊ฒฉ ๋ชจ๋“œ
function func() {
  console.log(this === window);	// true
}
func();

// 2. ์—„๊ฒฉ ๋ชจ๋“œ
function func() {
  'use strict';
  console.log(this === window);	// false
  console.log(this === undefined);	// true
}
func();
  1. ์‹คํ–‰ ํ™˜๊ฒฝ์ด ๋ธŒ๋ผ์šฐ์ €์ผ ๋•Œ
    1. ์ „์—ญ ๊ฐ์ฒด๋Š” window๋กœ, ์ „์—ญ ์‹คํ–‰๋ฌธ์—์„œ this๋Š” window๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค.
    2. ๋‹จ, 'use strict'๋ฅผ ์“ฐ๋ฉด undefined์ด๋‹ค.
  2. ์‹คํ–‰ ํ™˜๊ฒฝ์ด Node.js์ผ ๋•Œ
    1. ์ „์—ญ ๊ฐ์ฒด๋Š” global์ด๋‚˜, Node.js์˜ ์ตœ์ƒ์œ„ ์Šค์ฝ”ํ”„ ์ฝ”๋“œ๊ฐ€ CommonJS ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„ ๋‚ด์—์„œ ์‹คํ–‰๋˜์–ด,
      ์ „์—ญ ์‹คํ–‰๋ฌธ์—์„œ this๊ฐ€ global์„ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š๋Š”๋‹ค. → this๋Š” {}๋นˆ ๊ฐ์ฒด๋ฅผ ๋ฐ”์ธ๋”ฉ
    2. ๋น„์—„๊ฒฉ ๋ชจ๋“œ์—์„œ๋Š” global, ์—„๊ฒฉ ๋ชจ๋“œ์—์„œ๋Š” undefined๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

3. ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์—์„œ์˜ this

๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ํ•จ์ˆ˜๋ฅผ ๋ฉ”์„œ๋“œ๋ผ๊ณ  ํ•œ๋‹ค.

๋ฉ”์„œ๋“œ์˜ this ๋ฐ”์ธ๋”ฉ์€ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ์†Œ์œ ํ•˜๋Š” ๊ฐ์ฒด๋กœ ๋œ๋‹ค.

const obj = {
  lang: 'javascript',
  greeting() {
    console.log(this);
    return `hello ${this.lang}`;
  }
}
console.log(obj.greeting());	// hello javascript
console.log(greeting());	// hello undefined
 

4. ์ƒ์„ฑ์ž ํ˜ธ์ถœ์—์„œ์˜ this

new ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ๋™์ž‘ํ•œ๋‹ค.

์ƒ์„ฑ์ž ํ•จ์ˆ˜ ์•ˆ์—์„œ this๋Š” ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

function Vehicle(type) {
  this.type = type;
}
const car = new Vehicle('Car');	// ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ

์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ, ๋™์ž‘ ์ˆœ์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. ํ”„๋กœํผํ‹ฐ ์ƒ์„ฑ : this๊ฐ€ ๋ฐ”์ธ๋”ฉํ•œ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ์ƒ์„ฑ
    → ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒˆ ๊ฐ์ฒด ์ƒ์„ฑ   e.g. this = {}
  2. this ๋ฐ”์ธ๋”ฉ : ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ this์— ๋ฐ”์ธ๋”ฉ๋จ
  3. ํ”„๋กœํผํ‹ฐ/๋ฉ”์„œ๋“œ ์ •์˜ : ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ this.xxx = yyy๋กœ ํ”„๋กœํผํ‹ฐ/๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐ์ฒด์— ์ถ”๊ฐ€๋จ
  4. ์•”๋ฌต์  ๋ฐ˜ํ™˜ : ๋ช…์‹œ์ ์œผ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ํ•œ, this๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ ์ƒˆ ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋จ
 

5. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์—์„œ์˜ this

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์ •์˜๋œ ์‹œ์ ์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ this๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

const obj = {
  name: "๋‹ค์—ฐ",
  arrow: () => console.log(this.name)
};
obj.arrow(); // undefined

๊ฐ์ฒด๋ฅผ ๋ช…์‹œํ•˜๊ณ  arrow๋ฅผ ํ˜ธ์ถœํ–ˆ์œผ๋‚˜, ๋ฉ”์„œ๋“œ์˜ ๊ฒฝ์šฐ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ undefine๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์ธ arrow๋Š” this๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๊ณ , ์ƒ์œ„ ์Šค์ฝ”ํ”„(์ „์—ญ ๊ฐ์ฒด ๋“ฑ)์˜ this๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ,

ํ˜„์žฌ ์ƒ์œ„ ์Šค์ฝ”ํ”„์—๋Š” name์ด ์ •์˜๋˜์ง€ ์•Š์•˜๊ธฐ์— undefined๊ฐ€ ๋‚˜์˜จ๋‹ค.

  • obj ๊ฐ์ฒด ์™ธ๋ถ€ (์ฆ‰, ์ƒ์œ„ ์Šค์ฝ”ํ”„)์— ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด obj.arrow();๊ฐ€ ์ œ๋Œ€๋กœ ์ถœ๋ ฅ๋œ๋‹ค.
    → this.name = "๋‹ค์—ฐ";

 

 

๋”๋ณด๊ธฐ
๋ฐ˜์‘ํ˜•