[JS] this (1)

ToTheEndยท2023๋…„ 5์›” 1์ผ

JS

๋ชฉ๋ก ๋ณด๊ธฐ
1/2

JS์˜ this?

๋ฐฐ๊ฒฝ
๐Ÿ’ก js์—์„œ this๋Š”,
์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด ๋˜๋Š” ์ž์‹ ์ด ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ž๊ธฐ ์ฐธ์กฐ ๋ณ€์ˆ˜(self-referencing variable)์ž…๋‹ˆ๋‹ค.
์ด this๋Š”, ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด arguments๊ฐ์ฒด์™€ this๊ฐ€ ์•”๋ฌต์ ์œผ๋กœ ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์ „๋‹ฌ๋˜๋ฉด์„œ ๋งŒ๋“ค์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋ฐฉ์‹์— ๋”ฐ๋ผ์„œ this์— ๋ฐ”์ธ๋”ฉ๋˜๋Š” ๊ฐ์ฒด๋Š” ๋™์ ์œผ๋กœ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹๊ณผ this๋ฐ”์ธ๋”ฉ

๐Ÿ’ก ๋งŒ๋“ค์–ด์ง„ ํ•จ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœํ•˜๋А๋ƒ์— ๋”ฐ๋ผ this์— ๋ฐ”์ธ๋”ฉ๋  ๊ฐ์ฒด๊ฐ€ ๋™์ ์œผ๋กœ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

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

  1. ํ•จ์ˆ˜ํ˜ธ์ถœ
  2. ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ
  3. ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ
  4. Fucntion.prototype.apply/call/bind ๋ฉ”์†Œ๋“œ์— ์˜ํ•œ ๊ฐ„์ ‘ ํ˜ธ์ถœ
const foo = function() {
	console.dir(this); 
};

// 1. ์ผ๋ฐ˜ํ•จ์ˆ˜ ํ˜ธ์ถœ
// foo๋‚ด๋ถ€์˜ this๋Š” window๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค 
foo(); // window

// 2. ๋ฉ”์†Œ๋“œ๋กœ์„œ ํ˜ธ์ถœ
// ๋ฉ”์†Œ๋“œ๋กœ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด, ํ•œ ๊ฐ์ฒด์˜ property๊ฐ’์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ• ๋‹น 
// foo๋‚ด๋ถ€์—์„œ this๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ํ”„๋กœํผํ‹ฐ๋กœ ๊ฐ€์ง€๋ฉด์„œ, ํ˜ธ์ถœํ•œ ๊ฐ์ฒด obj๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค
const obj = { foo : foo};
obj.foo(); // obj 

// 3. ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœํ•˜๊ธฐ
// ํ•จ์ˆ˜๋ฅผ new์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœํ•œ๋‹ค 
// foo๋‚ด๋ถ€์˜ this๋Š”, ์ด ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ๋งŒ๋“ค์–ด๋‚ธ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค 
new foo(); 

// 4. apply/call/bind๋ฉ”์†Œ๋“œ 
// ์ด๋•Œ๋Š”, ์ข€ ๋” ์ต์ˆ™ํ•˜๊ฒŒ ์•Œ๊ณ  ์žˆ๋Š” ๋ฐฉ์‹!
// foo๋‚ด๋ถ€์˜ this๋Š”, ์ „๋‹ฌ๋ฐ›์„ ์ธ์ˆ˜์— ์˜ํ•ด์„œ ๊ฒฐ์ •๋œ๋‹ค 
const bar = {name: 'bar'};

foo.call(bar);
foo.apply(bar);
foo.bind(bar)(); 

1. ํ•จ์ˆ˜ํ˜ธ์ถœ

๋ฐฐ๊ฒฝ

  • js์—์„œ ์ „์—ญ๊ฐ์ฒด๋Š” ๋ชจ๋“  ๊ฐ์ฒด์˜ ์œ ์ผํ•œ ์ตœ์ƒ์œ„ ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ์ „์—ญ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๋Š” ์ „์—ญ๋ณ€์ˆ˜๋ฅผ property๋กœ ์†Œ์œ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • Browser-side โ†’ window
  • Server-side โ†’ global

this๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉ๋˜๋Š” ๊ฐ์ฒด๋Š”?

  • ์ „์—ญํ•จ์ˆ˜๋Š” ๋ฌผ๋ก 
  • ์ „์—ญํ•จ์ˆ˜์•ˆ์˜ ๋‚ด๋ถ€ํ•จ์ˆ˜๋„
  • ๋ฉ”์†Œ๋“œ์˜ ๋‚ด๋ถ€ํ•จ์ˆ˜์ผ ๋•Œ๋„
  • ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ๊นŒ์ง€ ..
// ๋ฉ”์†Œ๋“œ์˜ ๋‚ด๋ถ€ํ•จ์ˆ˜์ธ ๊ฒฝ์šฐ

var value = 1;

var obj = {
  value: 100,
  foo: function() {
    console.log("foo's this: ",  this);  // obj
    console.log("foo's this.value: ",  this.value); // 100
    **function bar() {
      console.log("bar's this: ",  this); // window
      console.log("bar's this.value: ", this.value); // 1
    }**
    bar();
  }
};

obj.foo();

๐Ÿ“ ๋‚ด๋ถ€ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜, ๋ฉ”์†Œ๋“œ, ์ฝœ๋ฐฑํ•จ์ˆ˜ ์–ด๋””์—์„œ ์„ ์–ธ๋˜์—ˆ๋“  ๊ด€๊ฒŒ์—†์ด this๋Š” ์ „์—ญ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค


this๊ฐ€ ์ „์—ญ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์„ ํšŒํ”ผํ•ด๋ณด์ž
var value = 1; 

const obj= {
	value : 100, 
	foo() {
		// this์— ๋ฐ”์ธ๋”ฉ๋œ ๊ฐ์ฒด(obj)๋ฅผ, ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ํ• ๋‹นํ•ด๋ณด์ž
		const that = this; 

		// ๋‚ด๋ถ€ ๋ฉ”์†Œ๋“œ์—์„œ ํ™œ์šฉํ•˜๊ธฐ
		setTimeout(function() {
			console.log(that.value); // 100 
		}, 100); 
	}
}; 

obj.foo(); 
Function.prototype.apply / call / bind ๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉํ•ด๋ณด์ž
var value = 1;

const obj = {
  value: 100,
  foo() {
    // ์ฝœ๋ฐฑ ํ•จ์ˆ˜์— ๋ช…์‹œ์ ์œผ๋กœ this๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค.
    **setTimeout(function () {
      console.log(this.value); // 100
    }.bind(this), 100);**
  }
};

obj.foo();
ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋„ ํ™œ์šฉํ•ด๋ณด์ž
var value = 1;

const obj = {
  value: 100,
  foo() {
    **// ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๋Š” ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ this๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.**
    setTimeout(() => console.log(this.value), 100); // 100
  }
};

obj.foo();
์š”์•ฝ

๐Ÿ“œ js์—์„œ this๋Š”, ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด ๋˜๋Š” ์ž์‹ ์ด ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ž๊ธฐ ์ฐธ์กฐ ๋ณ€์ˆ˜(self-referencing variable)์ž…๋‹ˆ๋‹ค.
์ด this๋Š”, ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด arguments๊ฐ์ฒด์™€ this๊ฐ€ ์•”๋ฌต์ ์œผ๋กœ ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์ „๋‹ฌ๋˜๋ฉด์„œ ๋งŒ๋“ค์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋ฐฉ์‹์— ๋”ฐ๋ผ์„œ this์— ๋ฐ”์ธ๋”ฉ๋˜๋Š” ๊ฐ์ฒด๋Š” ๋™์ ์œผ๋กœ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

this์˜ ๋ฐ”์ธ๋”ฉ์— ๊ด€์—ฌํ•˜๋Š” ํ•จ์ˆ˜ํ˜ธ์ถœ ๋ฐฉ์‹์—๋Š” ํ•จ์ˆ˜ํ˜ธ์ถœ, ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ, ์ƒ์„ฑ์ž ํ•จ์ˆ˜ํ˜ธ์ถœ, apply/call/bind๋ฉ”์†Œ๋“œ์— ์˜ํ•œ ๊ฐ„์ ‘ํ˜ธ์ถœ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ๊ฒฝ์šฐ, this์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „์—ญ๊ฐ์ฒด๊ฐ€ ๋ฐ”์ธ๋”ฉ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ this๊ฐ€ ์ „์—ญ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด, ๋ฉ”์†Œ๋“œ ์ƒ์œ„์—์„œ const๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•ด this๋ฅผ ๋ฐ”์ธ๋”ฉํ•ด๋‘๊ณ , ๋ฉ”์†Œ๋“œ๋‚ด์—์„œ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ฐ–์—๋„, Function๊ฐ์ฒด์˜ apply, call, bind๋ฉ”์†Œ๋“œ์™€ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•ด์„œ๋„ ์ž๋™์ฐธ์กฐ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


0๊ฐœ์˜ ๋Œ“๊ธ€