this - hochan222/Everything-in-JavaScript GitHub Wiki

MDN

  • JavaScript์—์„œ ํ•จ์ˆ˜์˜ this ํ‚ค์›Œ๋“œ๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์™€ ์กฐ๊ธˆ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค. ๋˜ํ•œ ์—„๊ฒฉ ๋ชจ๋“œ์™€ ๋น„์—„๊ฒฉ ๋ชจ๋“œ์—์„œ๋„ ์ผ๋ถ€ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.
  • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ(global, function ๋˜๋Š” eval)์˜ ํ”„๋กœํผํ‹ฐ๋Š” ๋น„์—„๊ฒฉ ๋ชจ๋“œ์—์„œ ํ•ญ์ƒ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋ฉฐ, ์—„๊ฒฉ ๋ชจ๋“œ์—์„œ๋Š” ์–ด๋– ํ•œ ๊ฐ’์ด๋“  ๋  ์ˆ˜ ์žˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ this์˜ ๊ฐ’์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ๋ฐฉ๋ฒ•์— ์˜ํ•ด ๊ฒฐ์ •๋œ๋‹ค. ์‹คํ–‰์ค‘์—๋Š” ํ• ๋‹น์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์—†๊ณ  ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.
ES5๋Š” ํ•จ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœํ–ˆ๋Š”์ง€ ์ƒ๊ด€ํ•˜์ง€ ์•Š๊ณ  this ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” bind ๋ฉ”์„œ๋“œ๋ฅผ ๋„์ž…ํ–ˆ๋‹ค.
ES2015๋Š” ์Šค์Šค๋กœ์˜ this ๋ฐ”์ธ๋”ฉ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค(์ด๋Š” ๋ ‰์‹œ์ปฌ ์ปจํ…์ŠคํŠธ์•ˆ์˜ this๊ฐ’์„ ์œ ์ง€ํ•œ๋‹ค).

๋†€๋ผ์šด ์‚ฌ์‹ค์€ MDN์˜ ์˜ˆ์ œ์— 42๊ฐ€ ์žˆ๋‹ค!!?! ์œ„๋Œ€ํ•˜๋‹ค 42...

const test = {
  prop: 42,
  func: function() {
    return this.prop;
  },
};

console.log(test.func());
// expected output: 42

Global Context

  • ์ „์—ญ ์‹คํ–‰ ๋ฌธ๋งฅglobal execution context์—์„œ this๋Š” ์—„๊ฒฉ ๋ชจ๋“œ ์—ฌ๋ถ€์— ๊ด€๊ณ„ ์—†์ด ์ „์—ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
// ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” window ๊ฐ์ฒด๊ฐ€ ์ „์—ญ ๊ฐ์ฒด
console.log(this === window); // true

a = 37;
console.log(window.a); // 37

this.b = "MDN";
console.log(window.b)  // "MDN"
console.log(b)         // "MDN"

NOTE: globalThis๋กœ ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ ์ „์—ญ ๊ฐ์ฒด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. globalThis ์†์„ฑ์€ ํ™˜๊ฒฝ์— ๋ฌด๊ด€ํ•˜๊ฒŒ ์ „์—ญ this ๊ฐ’, ์ฆ‰ ์ „์—ญ ๊ฐ์ฒด์— ์ ‘๊ทผํ•˜๋Š” ํ‘œ์ค€ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

Function Context

  • ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ this์˜ ๊ฐ’์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ๋ฐฉ๋ฒ•์— ์˜ํ•ด ์ขŒ์šฐ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์ œ๋Š” ์—„๊ฒฉ ๋ชจ๋“œ๊ฐ€ ์•„๋‹ˆ๋ฉฐ this์˜ ๊ฐ’์ด ํ˜ธ์ถœ์— ์˜ํ•ด ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” window์ธ ์ „์—ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

function f1() {
  return this;
}

// ๋ธŒ๋ผ์šฐ์ €
f1() === window; // true

// Node.js
f1() === global; // true

๋ฐ˜๋ฉด์— ์—„๊ฒฉ ๋ชจ๋“œ์—์„œ this ๊ฐ’์€ ์‹คํ–‰ ๋ฌธ๋งฅ์— ์ง„์ž…ํ•˜๋ฉฐ ์„ค์ •๋˜๋Š” ๊ฐ’์„ ์œ ์ง€ํ•˜๋ฏ€๋กœ ๋‹ค์Œ ์˜ˆ์‹œ์—์„œ ๋ณด์—ฌ์ง€๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ this๋Š” undefined๋กœ ๋‚จ์•„์žˆ๋‹ค.

function f2(){
  "use strict"; // ์—„๊ฒฉ ๋ชจ๋“œ ์ฐธ๊ณ 
  return this;
}

f2() === undefined; // true

๋น„์—„๊ฒฉ ๋ชจ๋“œ์—์„œ this๋กœ ์ „๋‹ฌ๋œ ๊ฐ’์ด ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ, call๊ณผ apply๋Š” ์ด๋ฅผ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ์‹œ๋„๋ฅผ ํ•œ๋‹ค.

Object Method

  • ํ•จ์ˆ˜๋ฅผ ์–ด๋–ค ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋กœ ํ˜ธ์ถœํ•˜๋ฉด this์˜ ๊ฐ’์€ ๊ทธ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
var o = {
  prop: 37,
  f: function() {
    return this.prop;
  }
};

console.log(o.f()); // 37

ํ•จ์ˆ˜ ํ˜ธ์ถœ call, apply, bind์˜ ์ฐจ์ด