Skip to content

Latest commit

ย 

History

History
342 lines (264 loc) ยท 12.1 KB

chapter3_this.md

File metadata and controls

342 lines (264 loc) ยท 12.1 KB

this

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

1. this๋Š” ์ƒํ™ฉ์—๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค.

1-1. ์ „์—ญ ๊ณต๊ฐ„์—์„œ์˜ this๋Š” ์ „์—ญ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.(๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” window,Node.js์—์„œ๋Š” global ์ฐธ์กฐ)

1-2. ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ๋ฉ”์„œ๋“œ๋กœ์„œ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ this๋Š” ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ฃผ์ฒด(๋ฉ”์„œ๋“œ๋ช… ์•ž์˜ ๊ฐ์ฒด)๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.(๋ฉ”์„œ๋“œ๋กœ์„œ์˜ ํ˜ธ์ถœ์ด๋ž€,ํ•จ์ˆ˜๋ฅผ .ํ‘œ๊ธฐ๋ฒ•,๋Œ€๊ด„ํ˜ธ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ํ˜ธ์ถœ์„ ํ•œ ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค.)

1-3. ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ this๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•œ๋‹ค. (๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์ •์˜ํ•œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ• ๊ฒฝ์šฐ๋„ ๋™์ผํ•˜๋‹ค.)

1-4. ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this๋Š” ํ•ด๋‹น ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ๋ฐ›์€ ํ•จ์ˆ˜๊ฐ€ ์ •์˜ํ•œ ๋ฐ”์— ๋”ฐ๋ฅด๋ฉฐ, ์ •์˜ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

1-5. ์ƒ์„ฑ์ž ํ•จ์ˆ˜์—์„œ์˜ this๋Š” ์ƒ์„ฑ๋  ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

2. ๋ช…์‹œ์  this ๋ฐ”์ธ๋”ฉ( ์œ„ ๊ทœ์น™์— ๋ถ€ํ•ฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—” ์•„๋ž˜ ๋‚ด์šฉ์œผ๋กœ this๋ฅผ ์˜ˆ์ธก ํ•  ์ˆ˜ ์žˆ๋‹ค.)

2.1 call,apply ๋ฉ”์„œ๋“œ๋Š” this๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜๋ฉด์„œ ํ•จ์ˆ˜ ๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

2.2 bind๋ฉ”์„œ๋“œ๋Š” this ๋ฐ ํ•จ์ˆ˜์— ๋„˜๊ธธ ์ธ์ˆ˜๋ฅผ ์ผ๋ถ€ ์ง€์ •ํ•ด์„œ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค.

2.3 ์š”์†Œ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋ณต ํ˜ธ์ถœํ•˜๋Š” ๋‚ด์šฉ์˜ ์ผ๋ถ€ ๋ฉ”์„œ๋“œ๋Š” ๋ณ„๋„์˜ ์ธ์ž๋กœ this๋ฅผ ๋ฐ›๊ธฐ๋„ ํ•œ๋‹ค.


1.1 ์ „์—ญ ๊ณต๊ฐ„์—์„œ์˜ this๋Š” ์ „์—ญ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.(๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” window,Node.js์—์„œ๋Š” global ์ฐธ์กฐ)

console.log(this); // { alert: f(), atob: f(), blur: f(), btoa: f(), ... }
console.log(window); // { alert: f(), atob: f(), blur: f(), btoa: f(), ... }
console.log(this === window); // true

1-2. ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ๋ฉ”์„œ๋“œ๋กœ์„œ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ this๋Š” ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ฃผ์ฒด(๋ฉ”์„œ๋“œ๋ช… ์•ž์˜ ๊ฐ์ฒด)๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

1-3. ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ this๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•œ๋‹ค. (๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์ •์˜ํ•œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ• ๊ฒฝ์šฐ๋„ ๋™์ผํ•˜๋‹ค.)

ํ•จ์ˆ˜ vs ๋ฉ”์„œ๋“œ

  • ๋…๋ฆฝ์„ฑ ์ฐจ์ด.
  • ํ•จ์ˆ˜ : ๊ทธ ์ฐจ์ฒด๋กœ ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰.
  • ๋ฉ”์„œ๋“œ : ๋Œ€์ƒ ๊ฐ์ฒด์— ๊ด€ํ•œ ๋™์ž‘์„ ์ˆ˜ํ–‰.
var func = function (x) {
  // ์‹คํ–‰ํ•  ํ•จ์ˆ˜ ์ •์˜.
  console.log(this, x);
};

func(1); // Window { ... } 1

var obj = {
  method: func,
};
obj.method(2); // { method: f } 2
obj["method"](2); // { method: f } 2

// ํ•จ์ˆ˜ ์•ž์— ์ (.) or ๋Œ€๊ด„ํ˜ธ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ• ๊ฒฝ์šฐ์—” ๋ฉ”์„œ๋“œ๋กœ์„œ ํ˜ธ์ถœํ•œ๊ฒƒ
var obj1 = {
  outer: function () {
    console.log(this);
    var innerFunc = function () {
      console.log(this);
    };
    innerFunc(); // (2) ์•ž์— ์•„๋ฌด๊ฒƒ๋„์—†์Œ์œผ๋กœ window ์ถœ๋ ฅ. (ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ)

    var obj2 = {
      innerMethod: innerFunc,
    };
    obj2.innerMethod(); // (3) ์•ž์— (.)์ด ์กด์žฌํ•จ์œผ๋กœ, this๋กœ obj2๊ฐ€์ถœ๋ ฅ๋จ. (๋ฉ”์„œ๋“œ๋กœ์„œ ํ˜ธ์ถœ)
  },
};

obj1.outer(); // (1)  ์•ž์— (.)์ด ์กด์žฌํ–ˆ์Œ์œผ๋กœ, this๋กœ obj๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค. ( ๋ฉ”์„œ๋“œ๋กœ์จ ํ˜ธ์ถœ)

1-4. ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this๋Š” ํ•ด๋‹น ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ๋ฐ›์€ ํ•จ์ˆ˜๊ฐ€ ์ •์˜ํ•œ ๋ฐ”์— ๋”ฐ๋ฅด๋ฉฐ, ์ •์˜ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

  • ์ฝœ๋ฐฑํ•จ์ˆ˜ : ํ•จ์ˆ˜ A์˜ ์ œ์–ด๊ถŒ์„ ๋‹ค๋ฅธํ•จ์ˆ˜(๋˜๋Š” ๋ฉ”์„œ๋“œ) B์—๊ฒŒ ๋„˜๊ฒจ์ฃผ๋Š” ๊ฒฝ์šฐ ํ•จ์ˆ˜A๋ฅผ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ผ ํ•œ๋‹ค.
setTimeout(function () {
  console.log(this);
}, 300); // (1)

[1, 2, 3, 4, 5].forEach(function (x) {
  // (2)
  console.log(this, x);
});

document.body.innerHTML += '<button id="a">ํด๋ฆญ</button>';
document.body.querySelector("#a").addEventListener("click", function (e) {
  // (3)
  console.log(this, e); // <button id="a">ํด๋ฆญ</button>
});
// function(e) {...} ํ•จ์ˆ˜์˜ ์ œ์–ด๊ถŒ์„ ๋‹ค๋ฅธํ•จ์ˆ˜ addEventListener์—๊ฒŒ ๋„˜๊ฒจ์คŒ.
// function(e) {...} ํ•จ์ˆ˜๋ฅผ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ผํ•œ๋‹ค.
// addEventListener ๋ฉ”์„œ๋“œ๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ• ๋•Œ ์ž์‹ ์˜ this๋ฅผ ์ƒ์†ํ•˜๋„๋ก ์ •์˜๋˜์–ด์žˆ๋‹ค.
// ๋”ฐ๋ผ์„œ ์ฝœ๋ฐฑํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this๋Š” <button id="a">ํด๋ฆญ</button>.
  • ์ฝœ๋ฐฑํ•จ์ˆ˜ ๋‚ด์—์„  this๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ •์˜ ํ•  ์ˆ˜ ์—†๋‹ค.
  • ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง„ ํ•จ์ˆ˜๊ฐ€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ์˜ this๋ฅผ ๋ฌด์—‡์œผ๋กœ ํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋ฉฐ, ํŠน๋ณ„ํžˆ ์ •์˜ํ•˜์ง€์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „์—ญ๊ฐ์ฒด๋ฅผ ๋ฐ”๋ผ๋ณธ๋‹ค.

1-5. ์ƒ์„ฑ์ž ํ•จ์ˆ˜์—์„œ์˜ this๋Š” ์ƒ์„ฑ๋  ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„  ํ•จ์ˆ˜์— ์ƒ์„ฑ์ž๋กœ์„œ์˜ ์—ญํ• ์„ ํ•จ๊ป˜๋ถ€์—ฌํ•จ.
  • ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜์•ž์— new๋ช…๋ น์–ด์™€ ํ•จ๊ผ ํ˜ธ์ถœ์‹œ ์ƒ์„ฑ์ž๋กœ์จ ๋™์ž‘ํ•˜๊ฒŒ๋˜์–ด์žˆ๋‹ค. (ํด๋ž˜์Šค๋กœ์จ ๋™์ž‘)
  • ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ์จ ํ˜ธ์ถœ๋œ๊ฒฝ์šฐ, ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this๋Š” ์ƒˆ๋กœ๋งŒ๋“ค์–ด์งˆ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

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

  • ๊ณตํ†ต๋œ ์„ฑ์งˆ์„ ์ง€๋‹Œ ๊ฐ์ฒด๋“ค์„ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜.
  • ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด์—์„œ๋Š” ์ƒ์„œ์ž๋ฅผ ํด๋ž˜์Šค, ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด๋ฅผ ์ธ์Šคํ„ด์Šค๋ผ๊ณ ํ•œ๋‹ค.
  • ์ƒ์„ฑ์ž๋Š” ์ธ์Šคํ„ดํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ์œ„ํ•œ 'ํ‹€'.
var Cat = function (name, age) {
  this.bark = "์•ผ์˜น";
  this.name = name;
  this.age = age;
};
var choco = new Cat("์ดˆ์ฝ”", 7);
var nabi = new Cat("๋‚˜๋น„", 5);
console.log(choco, nabi);

/* ๊ฒฐ๊ณผ
Cat { bark: '์•ผ์˜น', name: '์ดˆ์ฝ”', age: 7 }.  
Cat { bark: '์•ผ์˜น', name: '๋‚˜๋น„', age: 5 }
*/
// ์ถœ๋ ฅ๋œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ–ˆ์„๋–„, choco,nabi์— ํ• ๋‹น๋˜๋Š” ๊ฐ’์„ ๋งŒ๋“ค๊ธฐ์œ„ํ•ด ํ˜ธ์ถœ๋œ ์ƒ์„ฑ์žํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this๋Š” ๊ฐ๊ฐ choco, nabi๋ฅผ ๊ฐ€๋ฆฌ์ผฐ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.



2.1 call,apply ๋ฉ”์„œ๋“œ๋Š” this๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜๋ฉด์„œ ํ•จ์ˆ˜ ๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

call ๋ฉ”์„œ๋“œ

  • call๋ฉ”์„œ๋“œ๋Š” call๋ฉ”์„œ๋“œ์˜ ํ˜ธ์ถœ ์ฃผ์ตœ๋ฅผ ์ฆ‰์‹œ ์‹คํ–‰์‹œํ‚จ๋‹ค.
  • ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ๋Š” this๋กœ ์„ค์ •ํ•  ๋Œ€์ƒ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. (์ฒซ๋ฒˆ์จฐ ์ธ์ž๋ฅผ this๋กœ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค)
  • ๋‘๋ฒˆ์จฐ ์ธ์ž๋กœ๋Š” ํ˜ธ์ถœํ•  ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ๋˜๋Š” ์ธ์ž๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
var func = function (a, b, c) {
  console.log(this, a, b, c);
};

func(1, 2, 3); // Window{ ... } 1 2 3
func.call({ x: 1 }, 4, 5, 6); // { x: 1 } 4 5 6

apply ๋ฉ”์„œ๋“œ

  • call ๋ฉ”์„œ๋“œ์™€ ๊ธฐ๋Šฅ์ ์œผ๋กœ๋Š” ์™„์ „๋™์ผ.
  • ํ•œ๊ฐ€์ง€ ์ฐจ์ด์ ์œผ๋กœ๋Š” ํ˜ธ์ถœํ•  ํ•จ์ˆ˜์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ์ธ์ž๋“ค์„ ๋ฐฐ์—ด๋กœ ๋ฐ›๋Š”๋‹ค.
var func = function (a, b, c) {
  console.log(this, a, b, c);
};

func.apply({ x: 1 }, [4, 5, 6]); // { x: 1 } 4 5 6

var obj = {
  a: 1,
  method: function (x, y) {
    console.log(this.a, x, y);
  },
};

obj.method.apply({ a: 4 }, [5, 6]); // 4 5 6

2.2 bind๋ฉ”์„œ๋“œ๋Š” this์ง€์ • ๋ฐ ํ•จ์ˆ˜์— ๋„˜๊ธธ ์ธ์ˆ˜๋ฅผ ์ผ๋ถ€ ์ง€์ •ํ•ด์„œ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค.

  • ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ call๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ์ฆ‰์‹œ ํ˜ธ์ถœํ•˜์ง€๋Š”์•Š๊ณ  ๋„˜๊ฒจ๋ฐ›์€ ๊ฐ’๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๋งŒ ํ•˜๋Š” ๋ฉ”์„œ๋“œ.
var func = function (a, b, c, d) {
  console.log(this, a, b, c, d);
};

func(1, 2, 3, 4); // Window{ ... } 1 2 3 4

var bindFunc1 = func.bind({ x: 1 }); // 1. ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ ์ƒ์„ฑ.
bindFunc1(5, 6, 7, 8); // { x: 1 } 5 6 7 8

var bindFunc2 = func.bind({ x: 1 }, 4, 5); // 2. ๋ถ€๋ถ„์ ์šฉ ๊ตฌํ˜„.
bindFunc2(6, 7); // { x: 1 } 4 5 6 7
bindFunc2(8, 9); // { x: 1 } 4 5 8 9

2.3 name ํ”„๋กœํผํ‹ฐ

  • bind๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•ด์„œ ๋งŒ๋“  ํ•จ์ˆ˜์—” name ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ž๋™์œผ๋กœ ์„ค์ •๋œ๋‹ค.
  • ์ด name ํ”„๋กœํผํ‹ฐ๋ฅผํ†ตํ•ด ์–ด๋–ค ํ•จ์ˆ˜๋กœ๋ถ€ํ„ฐ ๋ฐ”์ธ๋“œ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด call/apply๋ณด๋‹ค ์ฝ”๋“œ ์ถ”์ ์ด ์ˆ˜์›”ํ•ด์ง„๋‹ค.
var func = function (a, b, c, d) {
  console.log(this, a, b, c, d);
};
var bindFunc = func.bind({ x: 1 }, 4, 5);
console.log(func.name); // func
console.log(bindFunc.name); // bound func

2.4 ์ƒ์œ„ ์ปจํ…์ŠคํŠธ์˜ this๋ฅผ ๋‚ด๋ถ€ํ•จ์ˆ˜๋‚˜ ์ฝœ๋ฐฑํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๊ธฐ

  • ๋‚ด๋ถ€ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๊ธฐ 1. call
var obj = {
  outer: function () {
    console.log(this); // 1. obj
    var innerFunc = function () {
      console.log(this); // 3. obj (call์„ ์ ์šฉํ•˜์ง€์•Š์•˜๋‹ค๋ฉด, window๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.)
    };
    innerFunc.call(this); // 2. this์— obj์ „๋‹ฌ
  },
};
obj.outer(); // ์‹คํ–‰
  • ๋‚ด๋ถ€ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๊ธฐ 2. bind
var obj = {
  outer: function () {
    console.log(this); // 1. obj
    var innerFunc = function () {
      console.log(this); // 4. obj  (bind๋ฅผ ์ ์šฉํ•˜์ง€์•Š์•˜๋‹ค๋ฉด, window๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.)
    }.bind(this); // 2. obj๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ ํ•จ์ˆ˜ ์ƒ์„ฑ.
    innerFunc(); // 3. ์‹คํ–‰
  },
};
obj.outer(); // ์‹คํ–‰

2.4 ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์˜ ์˜ˆ์™ธ์‚ฌํ•ญ.

  • ์‹คํ–‰์ปจํ…์ŠคํŠธ ์ƒ์„ฑ ์‹œ this๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๊ณผ์ •์ด ์ œ์™ธ๋œ๋‹ค.
  • ์ฆ‰ ์ด ํ•จ์ˆ˜ ๋‚ด๋ถ€์—๋Š” this์ž์ฒด๊ฐ€ ์•„์˜ˆ ์—†์œผ๋ฉฐ, ์ ‘๊ทผ์„ ํ•˜๊ฒŒ๋ ์‹œ ์Šค์ฝ”ํ”„์ฒด์ธ์ƒ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด this์— ์ ‘๊ทผํ•˜๊ฒŒ๋œ๋‹ค.(์ƒ์œ„์Šค์ฝ”ํ”„๊ฐ€์•„๋‹Œ ์ƒ์œ„์Šค์ฝ”ํ”„์— ๋ฐ”์ธ๋”ฉ๋œ this)
var obj = {
  outer: function () {
    console.log(this); // obj
    var innerFunc = () => {
      console.log(this); // obj
    };
    innerFunc();
  },
};
obj.outer(); // ์‹คํ–‰

2.3 ์š”์†Œ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋ณต ํ˜ธ์ถœํ•˜๋Š” ๋‚ด์šฉ์˜ ์ผ๋ถ€ ๋ฉ”์„œ๋“œ๋Š” ๋ณ„๋„์˜ ์ธ์ž๋กœ this๋ฅผ ๋ฐ›๊ธฐ๋„ ํ•œ๋‹ค.

var report = {
  sum: 0,
  count: 0,
  add: function () {
    var args = Array.prototype.slice.call(arguments);
    args.forEach(function (entry) {
      this.sum += entry;
      ++this.count;
    }, this); // ๋ณ„๋„์˜ ์ธ์ž๋กœ this๋ฅผ ๋ฐ›๋Š”๋‹ค. (์ง€๊ธˆ์ƒํƒœ์—์„  report ๋ฐ”๋ผ๋ด„)
  },
  average: function () {
    return this.sum / this.count;
  },
};
report.add(60, 85, 95); //  ์•ž์— (.)์ด ์กด์žฌํ•จ์œผ๋กœ, this๋กœ report์„ค์ •.
console.log(report.sum, report.count, report.average()); // 240 3 80
  • ์œ„ forEachํ•จ์ˆ˜์™€๊ฐ™์ด ์š”์†Œ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ˜ธ์ถœํ•˜๊ณ  this๋ฅผ ๋ณ„๋„์˜ ์ธ์ž๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜๋ชฉ๋ก.
Array.prototype.forEach(callback[, thisArg])
Array.prototype.map(callback[, thisArg])
Array.prototype.filter(callback[, thisArg])
Array.prototype.some(callback[, thisArg])
Array.prototype.every(callback[, thisArg])
Array.prototype.find(callback[, thisArg])
Array.prototype.findIndex(callback[, thisArg])
Array.prototype.flatMap(callback[, thisArg])
Array.prototype.from(arrayLike[, callback[, thisArg]])
Set.prototype.forEach(callback[, thisArg])
Map.prototype.forEach(callback[, thisArg])

๊ฒฐ๋ก 

this๋ฐ”์ธ๋”ฉ์ด๋ž€?

  • ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ์ฃผ์ตœ๋ฅผ ์ง€์ •ํ•˜๋Š”๊ฒƒ์„ this๋ฐ”์ธ๋”ฉ์ด๋ผ ํ•œ๋‹ค.
  • ํ˜ธ์ถœ ์ฃผ์ตœ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ํ•จ์ˆ˜๋ฅผ ๋‹จ๋…์œผ๋กœ ํ˜ธ์ถœํ•˜๋ƒ,๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋กœ์จ ํ˜ธ์ถœํ•˜๋ƒ์˜ ์ฐจ์ด์—์„œ ๋ฐœ์ƒํ•œ๋‹ค. (์œ„์— 2-1-3 ํ•จ์ˆ˜ vs ๋ฉ”์„œ๋“œ์—์„œ ์˜ˆ์‹œ์ฝ”๋“œํ™•์ธ)

this๋ฐ”์ธ๋”ฉ์ด ์–ธ์ œ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€?

  • ํ•จ์ˆ˜์˜ ์‹คํ–‰์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋ ๋–„ ๋ฐœ์ƒํ•œ๋‹ค.

๋ช‡๊ฐ€์ง€ ์˜ˆ์™ธ์‚ฌํ•ญ.

  1. this๋ฅผ ์˜๋„์ ์œผ๋กœ ๋ณ€๊ฒฝ์‹œํ‚ฌ์ˆ˜์žˆ๋‹ค. call,apply,bind๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•.(์ด๊ฐ™์€๊ฒฝ์šฐ์—” ํ˜ธ์ถœ์ฃผ์ตœ์™€๋Š” ์ƒ๊ด€์ด ์˜๋„์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉ์„ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.)
  2. ํ™”์‚ดํ‘œํ•จ์ˆ˜๋กœ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ฒŒ๋˜๋ฉด. ์‹คํ–‰์ปจํ…์ŠคํŠธ๋‹จ๊ณ„์—์„œ this๋ฐ”์ธ๋”ฉ ๊ณผ์ •์ด ์ œ์™ธ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ํ™”์‚ดํ‘œํ•จ์ˆ˜ ์•ˆ์—์„œ์˜ this๋Š” ์ƒ์œ„ ์‹คํ–‰์ปจํ…์ŠคํŠธ์—์„œ ์ •์˜๋œ this๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ๋œ๋‹ค.
  3. ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ์จ(์ธ์ž๋กœ์จ) ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๊ฒŒ๋˜๋ฉด. ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์€ ํ•จ์ˆ˜์—๊ฒŒ ํ•จ์ˆ˜์˜ ์‹คํ–‰์—๋Œ€ํ•œ ๊ถŒํ•œ์ด ์œ„์ž„๋˜์–ด ์ฝœ๋ฐฑํ•จ์ˆ˜๋‚ด์—์„œ์˜ this๋˜ํ•œ ์ „๋‹ฌ๋ฐ›์€ ํ•จ์ˆ˜์—์˜ํ•ด ์ง€์ •์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.