# this

this๋Š” ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์˜ˆ์•ฝ์–ด์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์‚ฌ์ „์ ์ธ ์ •์˜๋กœ 'ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ํ™˜๊ฒฝ'์ด๋ฉฐ ์ข€ ๋” ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 'ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ์˜ ์ปจํ…์ŠคํŠธ'๋กœ ์ดํ•ดํ•˜์‹œ๋Š” ๊ฒŒ ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์–ธ์–ด์™€ ๋‹ค๋ฅด๊ฒŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ this๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฐ’๋“ค์„ ๊ฐ€๋ฅดํ‚ต๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์กฐ๊ธˆ ์–ด๋ ต๊ฒŒ ๋Š๊ปด์ง€๋Š” ๋ถ€๋ถ„๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” this๊ฐ€ ๊ฐ€์žฅ ๋งŽ์ด ํ™œ์šฉ๋˜๋Š” ์ƒํ™ฉ๋“ค์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

# ์ฒซ ๋ฒˆ์งธ this

์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์—์„œ ์‹คํ–‰ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

console.log(this); // window

this์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ปจํ…์ŠคํŠธ๋Š” ๊ธ€๋กœ๋ฒŒ(์ „์—ญ) ์ปจํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ถœ๋ ฅ๋œ window๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ตœ์ƒ์œ„ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

# ๋‘ ๋ฒˆ์งธ this

์•„๋ž˜์™€ ๊ฐ™์€ ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

var obj = {
  num: 10,
  printNum: function() {
    console.log(this.num);
  }
};

์—ฌ๊ธฐ์„œ obj.printNum()์„ ์‹คํ–‰ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

obj.printNum(); // 10

๊ฐ์ฒด ์†์„ฑ ํ•จ์ˆ˜ ์•ˆ์—์„œ์˜ this๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

# ์„ธ ๋ฒˆ์งธ this

์„ธ ๋ฒˆ์งธ๋กœ ์‚ดํŽด๋ณผ this๋Š” ๋จผ์ € ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ, ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜น์‹œ ์•„์ง ๊ฐœ๋…์ด ๋‚ฏ์„  ๋ถ„๋“ค์€ ๋งํฌ๋ฅผ ํด๋ฆญํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ดํŽด๋ณด์‹œ๊ณ  ๊ณ„์† ์ฝ์–ด๋‚˜๊ฐ€์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ž ๊ทธ๋Ÿผ ์ผ๋ฐ˜ ํ•จ์ˆ˜(ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ)์—์„œ์˜ this๋Š” ์–ด๋–ค ๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚ฌ๊นŒ์š”?

function showComment() {
  console.log(this);
}

์œ„ ํ•จ์ˆ˜๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์‹คํ–‰์‹œํ‚ค๋ฉด window ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ ์ผ๋ฐ˜ ํ•จ์ˆ˜์˜ this๋Š” ์ „์—ญ ์ปจํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

showComment(); // window

๊ทธ๋Ÿผ ์ด๋ฒˆ์—” ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ this๋ฅผ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

function Developer() {
  console.log(this);
}
var dev = new Developer();

์œ„ ์ฝ”๋“œ๋Š” ์‹คํ–‰ํ•˜์ž๋งˆ์ž ๋ฐ”๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์ฝ˜์†”์— ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

Developer {}

๊ทธ ์ด์œ ๋Š” new๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ˆœ๊ฐ„ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ ์•Œ ์ˆ˜ ์žˆ๋Š” ์‚ฌ์‹ค์€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ this๋Š” ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

# ๋„ค ๋ฒˆ์งธ this

๋„ค ๋ฒˆ์งธ๋กœ ์‚ดํŽด๋ณผ this๋Š” ์‹ค์ œ๋กœ ์›น ๊ฐœ๋ฐœ์„ ํ•  ๋•Œ ๊ฐ€์žฅ ๋งŽ์ด ๋งˆ์ฃผํ•˜๊ฒŒ ๋˜๋Š” this์ž…๋‹ˆ๋‹ค. ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” HTTP ์š”์ฒญ๊ณผ ๊ฐ™์€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

function fetchData() {
  axios.get('domain.com/products').then(function() {
    console.log(this);
  });
}

์œ„ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์–ด๋–ค ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚ ๊นŒ์š”? ์ •๋‹ต์€ window์ž…๋‹ˆ๋‹ค.

fetchData(); // window

๊ธฐ๋ณธ์ ์œผ๋กœ HTTP ์š”์ฒญ๊ณผ ๊ฐ™์€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋Š” ์ „์—ญ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์ •๋ฆฌํ•ด์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ฝ”๋“œ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์ „์—ญ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค๊ณ  ๋ณด๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.

# ๋ถ€๋ก

์œ„ ๋ณธ๋ฌธ์„ ์ดํ•ดํ•˜๋Š”๋ฐ ๋„์›€์ด ๋˜๋Š” ์ž๋ฃŒ๋“ค์ž…๋‹ˆ๋‹ค.

# ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ

ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€ ์•„๋ž˜์™€ ๊ฐ™์€ ํ•จ์ˆ˜ ์ •์˜ ๋ฐฉ์‹์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

// ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ
function functionName() {
  // ...
}

# ์ƒ์„ฑ์ž ํ•จ์ˆ˜

๊ทธ๋ฆฌ๊ณ  ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์„ ์–ธํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

function Developer() {
  // ...
}
var dev = new Developer();

TIP

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์–ธ์–ด๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ„์™€ ๊ฐ™์ด ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž๋ฐ” ๊ฐœ๋ฐœ์ž ๋ถ„๋“ค์€ ํด๋ž˜์Šค๊ฐ€ ์—†๋‹ค๊ณ  ๋‹นํ™ฉํ•˜์ง€ ๋งˆ์„ธ์š” ๐Ÿ˜ƒ