๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

TIL/๐Ÿชธ JS

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ this

this

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋กœ, ์ธํ„ฐํ”„๋ฆฌํ„ฐ์— ์˜ํ•ด ์ค„ ๋‹จ์œ„๋กœ ์ฝํ˜€ ํ•ด์„๋˜์–ด ์‹คํ–‰๋œ๋‹ค.

์ธํ„ฐํ”„๋ฆฌํ„ฐ์— ์˜ํ•ด ํ˜„์žฌ ์‹คํ–‰๋˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ™˜๊ฒฝ์„ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ผ๊ณ  ํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด๋ถ€์—์„œ ์ด๋Ÿฌํ•œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์Šคํƒ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์‹คํ–‰๋˜๋Š” ์‹œ์ ์— ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ this๊ฐ€ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

์ฆ‰, this๋Š” ํ˜„์žฌ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

 

 

 

 

this ํ‚ค์›Œ๋“œ


์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด ๋˜๋Š” ์ž์‹ ์ด ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค(์ƒ์„ฑ์žํ•จ์ˆ˜ ๋˜๋Š” class ์ด์šฉ)๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ž๊ธฐ ์ฐธ์กฐ ๋ณ€์ˆ˜

 

 

 

์ž๊ธฐ ์ฐธ์กฐ ๋ณ€์ˆ˜ (self-reference variable)

์ง์—ญํ•˜์ž๋ฉด ์Šค์Šค๋กœ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜

๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ์˜ this๋Š”, ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

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

์—ฌ๊ธฐ์„œ ๊ฐ€๋ฆฌํ‚จ๋‹ค๋Š” ๋‹ค๋ฅธ ๋ง๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋ฐ”์ธ๋”ฉ(binding)์ด๋ผ๊ณ  ํ•œ๋‹ค.

  • this๋ฅผ ํ†ตํ•ด ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด ๋˜๋Š” ์ž์‹ ์ด ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • this๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์— ์˜ํ•ด ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋ฉฐ, ์ฝ”๋“œ ์–ด๋””์„œ๋“  ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

[์˜ˆ์‹œ] - ์›์˜ ์ง€๋ฆ„ ๊ตฌํ•˜๊ธฐ

const circle = {
	radius: 5, // ํ”„๋กœํผํ‹ฐ: ๊ฐ์ฒด ๊ณ ์œ ์˜ ์ƒํƒœ ๋ฐ์ดํ„ฐ

	getDiameter() { // ๋ฉ”์†Œ๋“œ: ์ƒํƒœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์กฐ์ž‘ํ•˜๋Š” ๋™์ž‘
		return 2 * this.radius; // thiss๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด
	}
};

console.log(circle.getDiameter()); // 10
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ thiss๋Š” ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ this์— ๋ฐ”์ธ๋”ฉ๋  ๊ฐ’, ์ฆ‰ this ๋ฐ”์ธ๋”ฉ์ด ๋™์ ์œผ๋กœ ๊ฒฐ์ •๋œ๋‹ค.

 

 

this ๋ฐ”์ธ๋”ฉ


this ๋ฐ”์ธ๋”ฉ์€ this์— ๋ฐ”์ธ๋”ฉ ๋  ๊ฐ’์œผ๋กœ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์ด๋‹ค.

ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€, ํ˜ธ์ถœ ๋˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ this๊ฐ€ ์–ด๋””์— ๋ฐ”์ธ๋”ฉ ๋ ์ง€ ๋™์ ์œผ๋กœ ๊ฒฐ์ •๋œ๋‹ค.

 

 

ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹

  1. ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ
  2. ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ
  3. ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ (๊ฐ์ฒด ์ƒ์„ฑ ํ•จ์ˆ˜)
  4. Call, Apply, Bind ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ

 

 

1. ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ

const obj = function(){
	console.log(this); // ์ „์—ญ window
}
obj();
  • ๊ธฐ๋ณธ์ ์œผ๋กœ this์—๋Š” ์ „์—ญ ๊ฐ์ฒด๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.
  • ์ด๋•Œ this๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  • ๋‚ด๋ถ€ ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜, ๋ฉ”์†Œ๋“œ, ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์–ด๋””์—์„œ ์„ ์–ธ ๋˜์—ˆ๋“  ๊ด€๊ณ„์—†์ด this๋Š” ๋ชจ๋‘ ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค.

 

2. ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ

var person = {
	name: 'kim',
	printName: function() {
		console.log(this.name);
	}
}

person.printName()
  • ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ: ๊ฐ์ฒด์˜ ๊ฐ’์ด ํ•จ์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฒฝ์šฐ๋ฅผ ๋งํ•จ
  • this: ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋ฅผ ์†Œ์œ ํ•œ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.

 

3. ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ

var instatnce = new obj();
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜: ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ๋™์ž‘ ๊ณผ์ •
    • ๋นˆ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ this ๋ฐ”์ธ๋”ฉ
      • ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „, ๋นˆ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์ด๋Š” this๋กœ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.
    • this๋ฅผ ํ†ตํ•œ ํ”„๋กœํผํ‹ฐ ์ƒ์„ฑ
    • ์ƒ์„ฑ๋œ ๊ฐ์ฒด ๋ฐ˜ํ™˜
  • this: ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์„ ๊ฐ์ฒด์˜ ์†์„ฑ์— ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด this ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉ

 

 

4. Call, Apply, Bind ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ - ๋ช…์‹œ์  this ๋ฐ”์ธ๋”ฉ

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

  • Call, Apply : ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ
    • ๋Œ€ํ‘œ์ ์œผ๋กœ ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด์— ๋ฐฐ์—ด ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์— ํ™œ์šฉ
  • code์ฝ”๋“œ์—์„œ apply๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ์ž ํ•จ์ˆ˜ person ๋‚ด๋ถ€์˜ this์— ๊ฐ์ฒด obj๋ฅผ ๋ฐ”์ธ๋”ฉ์‹œ์ผฐ๋‹ค.
  • const Person = function (name) { this.name = name; }; const obj = {}; Person.apply(obj, ['name']); console.log(obj); // {name: 'name'}

  • bind : this๋กœ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋งŒ ์ „๋‹ฌ
    • ๋ฉ”์†Œ๋“œ์˜ this์™€ ๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€์˜ ์ค‘์ฒฉ ํ•จ์ˆ˜ ๋˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ this๊ฐ€ ๋ถˆ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
  • code์—ฌ๊ธฐ์„œ bind๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด this๋Š” person์˜ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ํ•จ์ˆ˜์—์„œ ํ˜ธ์ถœ๋˜์–ด ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค.
  • const person = { name: 'kim', obj(callback){ setTimeout(callback.bind(this),100); } }; person.obj(function(){ console.log(`my name is ${this.name}`); });

 

 

์ •๋ฆฌ

๐Ÿ’ก ํ•จ์ˆ˜ ํ˜ธ์ถœ์—์„œ์˜ this: ์ „์—ญ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ๋จ

๐Ÿ’ก ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์—์„œ์˜ this: ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋ฅผ ์†Œ์œ ํ•œ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ

๐Ÿ’ก ์ƒ์„ฑ์ž ํ•จ์ˆ˜์—์„œ์˜ this: this๋Š” ๊ฐ์ฒด ์†์„ฑ ํ• ๋‹น์„ ์œ„ํ•ด ์‚ฌ์šฉ

๐Ÿ’ก ๋ช…์‹œ์  this ๋ฐ”์ธ๋”ฉ: ํŠน์ • ๊ฐ์ฒด์— ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉ๋จ

 

  1. this๋Š” ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ๋ฐฉ์‹์— ๋”ฐ๋ผ ํŠน์ • ๊ฐ์ฒด๋ฅผ ๋ฐ”์ธ๋”ฉ ํ•˜๊ฒŒ๋œ๋‹ค.
  2. ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ this๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค์™€ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.
  3. Call, Apply, Bind ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ ์‹œ, ํ•จ์ˆ˜์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.
  4. Object.method ํ˜•ํƒœ์™€ ๊ฐ™์ด ๊ฐ์ฒด ๋‚ด์—์„œ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ, this๋Š” ํ•ด๋‹น ๊ฐ์ฒด์™€ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.
  5. 2,3,4๋ฅผ ์ œ์™ธํ•œ ์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ๊ฒฝ์šฐ, this๋Š” ์ „์—ญ ๊ฐ์ฒด์™€ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.
  6. ES6์˜ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋‚ด์—์„œ this๊ฐ€ ์‚ฌ์šฉ๋  ๊ฒฝ์šฐ, this๋Š” ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ this์™€ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.

this๋Š” ์‹คํ–‰ ๋ฌธ๋งฅ์— ๋”ฐ๋ผ ๊ฒฐ์ •๋œ๋‹ค. ์ด๋ฅผ ์‘์šฉํ•ด ์ด๋ฒคํŠธ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด this๋Š” ํ•ด๋‹น ์ด๋ฒคํŠธ ๊ฐ์ฒด์— ํ• ๋‹น๋˜๊ฒ ๊ตฌ๋‚˜ ๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

์ฐธ๊ณ ๋ฌธํ—Œ