์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ ๋‹ฌ๋ผ์ง€๋Š” this๋ฅผ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

    0 JavaScripot์—์„œ this
    1 ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” this
        1-1 ์ „์—ญ ๊ณต๊ฐ„์—์„œ์˜ this
        1-2 ๋ฉ”์„œ๋“œ๋กœ์„œ ํ˜ธ์ถœํ•  ๋•Œ ๊ทธ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ์˜ this
            ํ•จ์ˆ˜ vs ๋ฉ”์„œ๋“œ
            ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ์˜ this
        1-3 ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœํ•  ๋•Œ ๊ทธ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this
            ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this
            ๋ฉ”์„œ๋“œ์˜ ๋‚ด๋ถ€ํ•จ์ˆ˜์—์„œ์˜ this
            ๋ฉ”์„œ๋“œ์˜ ๋‚ด๋ถ€ ํ•จ์ˆ˜์—์„œ์˜ this๋ฅผ ์šฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•
            this๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜
        1-4 ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ๊ทธ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this
        1-5 ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this
    2 ๋ช…์‹œ์ ์œผ๋กœ this๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•
        2-1 call ๋ฉ”์„œ๋“œ
        2-2 apply ๋ฉ”์„œ๋“œ
        2-3 call/apply ๋ฉ”์„œ๋“œ์˜ ํ™œ์šฉ
            ์œ ์‚ฌ๋ฐฐ์—ด๊ฐ์ฒด์— ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ๋ฅผ ์ ์šฉ
            ์ƒ์„ฑ์ž ๋‚ด๋ถ€์—์„œ ๋‹ค๋ฅธ ์ƒ์„ฑ์ž ํ˜ธ์ถœ
            ์—ฌ๋Ÿฌ ์ธ์ˆ˜๋ฅผ ๋ฌถ์–ด ํ•˜๋‚˜์˜ ๋ฐฐ์—ด๋กœ ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ apply ํ™œ์šฉ
        2-4 bind ๋ฉ”์„œ๋“œ
            name ํ”„๋กœํผํ‹ฐ
            ์ƒ์œ„ ์ปจํ…์ŠคํŠธ์˜ this๋ฅผ ๋‚ด๋ถ€ํ•จ์ˆ˜๋‚˜ ์ฝœ๋ฐฑํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๊ธฐ
        2-5 arrow function์˜ ์˜ˆ์™ธ์‚ฌํ•ญ
        2-6 ๋ณ„๋„์˜ ์ธ์ž๋กœ this๋ฅผ ๋ฐ›๋Š” ๊ฒฝ์šฐ(์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด์—์„œ์˜ this)

JavaScripot์—์„œ this

  • ๋‹ค๋ฅธ ๊ฐ์ œ์ง€ํ–ฅ ์–ธ์–ด์™€ this์˜ ์ฐจ์ด์ 

    • ๋‹ค๋ฅธ ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์˜ this: ํด๋ž˜์Šค๋กœ ์ƒ์„ฑํ•œ ์ธ์Šคํ„ด์Šค ๊ฐ์ฒด

      • ํด๋ž˜์Šค์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š๊ฑฐ๋‚˜ ๋งŽ์ง€ ์•Š์Œ
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ this: ์–ด๋””์—์„œ๋‚˜ ์“ธ ์ˆ˜ ์žˆ์Œ

      • ์ƒํ™ฉ์— ๋”ฐ๋ผ this๊ฐ€ ๋ฐ”๋ผ๋ณด๋Š” ๋Œ€์ƒ์ด ๋‹ฌ๋ผ์ง
      • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์›์ธ์„ ์•Œ์•„์•ผ ํ•˜๋Š”๋ฐ, ์ •ํ™•ํ•œ ์ž‘๋™๋ฐฉ์‹์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋ฉด ์›์ธ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ค์›€
  • this ํ™•์ธ์œผ๋กœ 'ํ•จ์ˆ˜, ๊ฐ์ฒด(๋ฉ”์„œ๋“œ)'์˜ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑฐ์˜ ์œ ์ผํ•œ ๋ฐฉ๋ฒ•

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

this๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ํ•จ๊ป˜ ๊ฒฐ์ •(์‹คํ–‰์ปจํ…์ŠคํŠธ ์„ค๋ช…ํ• ๋•Œ ์„ค๋ช…๋จ)
์•„๋ž˜ ์ƒํ™ฉ๋ณ„๋กœ this๊ฐ€ 5๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ฐ’์„ ๋ณด์—ฌ์ฃผ๋Š” ๋‚ด์šฉ์„ ์„ค๋ช…

1-1 ์ „์—ญ ๊ณต๊ฐ„์—์„œ์˜ this

์ „์—ญ ๊ณต๊ฐ„์—์„œ this๋Š” ์ „์—ญ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

  • ์ „์—ญ ๋ณ€์ˆ˜์™€ ์ „์—ญ๊ฐ์ฒด

    var a = 1
    console.log(a) //1
    console.log(window.a) //1
    console.log(this.a) //1
  • ์œ„ ๊ฒฐ๊ณผ ๊ฐ’์ด ๊ฐ™์€์ด์œ ๋Š”?

    • ์ „์—ญ๋ณ€์ˆ˜ ์„ ์–ธ์‹œ javascrip engine์ด ์ „์—ญ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋กœ ํ• ๋‹น
    • javascript ๋ชจ๋“  ๋ณ€์ˆ˜๋Š” ํŠน์ • ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋กœ ๋“ฑ๋ก๋˜๊ณ  ๋™์ž‘

      • ํŠน์ •๊ฐ์ฒด: ์‹คํ–‰์ปจํ…์ŠคํŠธ์˜ LexicalEnvironment
      • ์ „์—ญ์ปจํ…์ŠคํŠธ์˜ ๊ฒฝ์šฐ LexicalEnvironment๋Š” ์ „์—ญ๊ฐ์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ ์ฐธ์กฐ(์‹คํ–‰์ปจํ…์ŠคํŠธ ๋„์‹ํ™” ๊ทธ๋ฆผ ์ฐธ๊ณ 
  • ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ ‘๊ทผํ•˜๋Š” ๊ณผ์ •์€? -> scope chain

    • a์— ์ ‘๊ทผํ•˜๊ณ ์ž ํ•˜๋ฉด ์Šค์ฝ”ํ”„ ์ฒด์ธ์—์„œ a๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋‹ค ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ๋„๋‹ฌํ•˜๋Š” '์ „์—ญ ์Šค์ฝ”ํ”„'์˜ LexcialEnvironment(์ „์—ญ๊ฐ์ฒด)์—์„œ ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๋ฅผ a๋ฅผ ๋ฐœ๊ฒฌํ•ด์„œ ๊ทธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ

  • ์ „์—ญ๋ณ€์ˆ˜์™€ ์ „์—ญ๊ฐ์ฒด์˜ ์ฐจ์ด์ 

    • ์ „์—ญ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋กœ ํ• ๋‹นํ•œ ๊ฒฝ์šฐ์—์„œ๋Š” ์‚ญ์ œ o
    • ์ „์—ญ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•œ ๊ฒฝ์šฐ์—๋Š” ์‚ญ์ œ x
    var b = 2;
    delete b;   //false
    console.log(b, window.b, this.b) //2 2 2
    
    window.c = 3;
    delete window.c;    //true
    console.log(c, window.c this.c); // Uncaught ReferenceError: c is not defined

1-2 ๋ฉ”์„œ๋“œ๋กœ์„œ ํ˜ธ์ถœํ•  ๋•Œ ๊ทธ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ์˜ this

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

  • ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ• 2๊ฐ€์ง€: ํ•จ์ˆ˜ํ˜ธ์ถœ, ๋ฉ”์„œ๋“œ

    • ํ•จ์ˆ˜: ๊ทธ ์ž์ฒด๋กœ ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰
    • ๋ฉ”์„œ๋“œ: ์ž์‹ ์„ ํ˜ธ์ถœํ•œ ๋Œ€์ƒ ๊ฐ์ฒด์— ๊ด€ํ•œ ๋™์ž‘์„ ์ˆ˜ํ–‰
  • ํ•จ์ˆ˜, ๋ฉ”์„œ๋“œ๋กœ ํ˜ธ์ถœ์‹œ this์˜ ์ฐจ์ด

    • ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ this: ์ „์—ญ๊ฐ์ฒด (์•„๋ž˜ ์˜ˆ์ œ์ฝ”๋“œ POINT ์ฃผ์„ ์ฐธ๊ณ )
    • ๋ฉ”์„œ๋“œ๋กœ ํ˜ธ์ถœ์‹œ this: ํ˜ธ์ถœํ•œ ๋ฉ”์„œ๋“œ

ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ, ๋ฉ”์„œ๋“œ๋กœ์„œ ํ˜ธ์ถœ ๋น„๊ต

var func = function(x){
  console.log(this, x);
} 
func(1);  // Window{...} 1

var obj = {
  method: func
}
obj.method(2) // {method: f} 2
  • ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ์‹œ ์ผ๋ฐ˜ํ•จ์ˆ˜, arrow function ์—ฌ๋ถ€์— ๋”ฐ๋ฅธ ์ฐจ์ด

    var obj = {
      bar: function() {
          // ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ์‹œ ์ผ๋ฐ˜ํ•จ์ˆ˜
          console.log(this) // {bar:f}
          return function() {
            return this;  // this = window
          };
      },
    }
    
    obj.bar()() === window //true     //POINT
    var obj = {
        bar: function() {
            // ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ์‹œ arrow function
            return () => this; //POINT: this = bar (์ฃผ์˜: use arrow funciton)
        }
    };
    obj.bar()() === obj //true

1-3 ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœํ•  ๋•Œ ๊ทธ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this

ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this

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

๋ฉ”์„œ๋“œ์˜ ๋‚ด๋ถ€ํ•จ์ˆ˜์—์„œ์˜ this

  • ์‹คํ–‰์ˆœ์„œ1,2,3์˜ return value

    • ์‹คํ–‰์ˆœ์„œ1: {outer: f, outer2: f} === obj1
    • ์‹คํ–‰์ˆœ์„œ2: window{...}
    • ์‹คํ–‰์ˆœ์„œ3: {obj2Property: "obj2Property", innerMethod: ฦ’}
    • ํฌ์ธํŠธ๋Š” ์‹คํ–‰์ˆœ์„œ2, 3์€ ๊ฐ™์€ function์„ ํ˜ธ์ถœํ•˜์ง€๋งŒ ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ(์‹คํ–‰์ˆœ์„œ2), ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ(์‹คํ–‰์ˆœ์„œ3)์— ๋”ฐ๋ผ this๊ฐ’์ด ๋‹ฌ๋ผ์ง„๋‹ค.
  • POINT

    • innerFunc์— console.log๋Š” B, C์— ์˜ํ•ด์„œ ํ˜ธ์ถœ์ด ๋˜๋Š”๋ฐ
    • B์ฒ˜๋Ÿผ innerFunc์ด ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋ ๋•Œ๋Š” this๋Š” ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค.
    • C์ฒ˜๋Ÿผ innerfunc์ด ๋ฉ”์„œ๋„๋กœ ํ˜ธ์ถœ๋ ๋•Œ๋Š” this๋Š” ํ˜ธ์ถœํ•œ ๋Œ€์ƒ์„ ๊ฐ€๋ฅดํ‚จ๋‹ค.
    var obj1 = {
      outer: function() {
        console.log(this) //์‹คํ–‰์ˆœ์„œ1 by A
        var innerFunc = function() {
          console.log(this) //์‹คํ–‰์ˆœ์„œ2 by B  / ์‹คํ–‰์ˆœ์„œ3 by C
        }
        innerFunc() // B
    
        var obj2 = {
          innerMethod: innerFunc,
          obj2Property: "obj2Property",
        }
        obj2.innerMethod() // C
      },
    
      outer2: function() {},
    }
    
    obj1.outer() // A

๋ฉ”์„œ๋“œ์˜ ๋‚ด๋ถ€ ํ•จ์ˆ˜์—์„œ์˜ this๋ฅผ ์šฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•

  • POINT ์ฐธ๊ณ 
  var obj1 = {
    outer: function() {
      console.log(this)   // {outer: f} 
      var innerFunc1 = function() {
        console.log(this) // window {...}
      }
      innerFunc1();

      var me = this;  // <= POINT
      var innerFunc2 = function() {
        console.log(me);  // <= POINT: {outer: f} 
      }
      innerFunc2() 
    },
  }

  obj1.outer() 

this๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜

์•„๋ž˜ ์˜ˆ์ œ ์ฃผ์„ ์ฐธ๊ณ 

  • log ๊ฒฐ๊ณผ๊ฐ’

    • [1]: {outer: f}
    • [2]: window {...}
    • [3]: {outer: f}
    • [4]: window {...}
    • [5]: {outer: f}
    var obj1 = {
    outer: function() {
      console.log(this) // [1]
      var innerFunc = function() {
        console.log(this) // [2]
      }
      innerFunc()
    
      var me = this
      var innerFunc2 = function() {
        console.log(me) // [3] POINT ๋ฉ”์„œ๋“œ์˜ ๋‚ด๋ถ€ ํ•จ์ˆ˜์—์„œ์˜ this๋ฅผ ์šฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•
        console.log(this) // [4]
      }
      innerFunc2()
    
      var innerFunc3 = () => {
        console.log(this) // [5] POINT: this๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜(arrow function)
      }
      innerFunc3()
    },
    }
    
    obj1.outer()

1-4 ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ๊ทธ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this

callback function์˜ ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง€๋Š” ํ•จ์ˆ˜(๋ฉ”์„œ๋“œ)๊ฐ€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ์˜ this๋ฅผ ๋ฌด์—‡์œผ๋กœ ํ• ์ง€๋ฅผ ๊ฒฐ์ •
ํŠน๋ณ„ํžˆ ์ •์˜ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•จ์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ „์—ญ๊ฐ์ฒด๋ฅผ ๋ฐ”๋ผ๋ณธ๋‹ค.
์ฝœ๋ฐฑ ํ•จ์ˆ˜์— bind๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 2-4 bind

setTimeout(function() {
  console.log(this) //window ๊ฐ์ฒด
}, 3000)
;
[1, 2, 3].forEach(function(v) {
  console.log(this, v) //window ๊ฐ์ฒด
})

//event Callback function ์ฐธ๊ณ 
document.body.innerHTML += `<button id="a"> ํด๋ฆญ </button>`
document.body.querySelector("#a").addEventListener("click", function(e) {
  console.log(this, e)
})
  • "button click event Callback function this"๊ณผ "id='a' dom" ๊ฐ์ฒด ๋น„๊ต => ๊ฐ™๋‹ค.

eventCallbackfunction

  • addEventListner function ๋‚ด๋ถ€ ๊ตฌํ˜„ ์ถ”์ธก

    • addEventListner function this๊ฐ€ 'document.body.querySelector('#a')' ์ด๊ธฐ ๋•Œ๋ฌธ์—
      ์ด ๊ฐ’์„ callback function์„ call๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด ๋ช…์‹œ์ ์œผ๋กœ this๋ฐ”์ธ๋”ฉ ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

          addEventListener: function(a, callbackFunc){
              ...
              callbackFunc.call(this, event);
              ...
          }

1-5 ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this

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

var Dog = function(name, age) {
  this.bark = "RRRR"
  this.name = name
  this.age = age
}

var planets = new Dog("ํ–‰์„ฑ", 2)
var girl = new Dog("์†Œ๋…€", 3)
var universe = new Dog("์šฐ์ฃผ", 1)

console.log(planets, girl, universe)
/*
    planets: Dog {bark: "RRRR", name: "ํ–‰์„ฑ", age: 2}
    girl: Dog {bark: "RRRR", name: "์†Œ๋…€", age: 3}
    universe: Dog {bark: "RRRR", name: "์šฐ์ฃผ", age: 1}
*/

console.log({ bark: planets.bark, name: planets.name, age: planets.age })
/*    
    {bark: "RRRR", name: "ํ–‰์„ฑ", age: 2}
*/
  • ์œ„ ๋‘ console.log๋ฅผ ํ™•์ธํ–ˆ์„๋•Œ Dog์—์˜ํ•ด์„œ ์ƒ์„ฑ๋œ instance๊ฐ€ this๊ฐ€ ๋œ๊ฒƒ์„ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

2 ๋ช…์‹œ์ ์œผ๋กœ this๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•

2 ์ด ๋ชฉ์ฐจ๋Š” call(), apply(), bind()์— ๋Œ€ํ•ด์„œ ์ž์„ธํ•˜๊ฒŒ ๋‹ค๋ฃจ๋„๋ก ์œ„ํ•ด์„œ ๋‹ค๋ฅธ ํฌ์ŠคํŠธ์—์„œ ์„ค๋ช…ํ•˜๋„๋กํ•œ๋‹ค. call(), apply(), bind()

2-1 call ๋ฉ”์„œ๋“œ

2-2 apply ๋ฉ”์„œ๋“œ

2-3 call/apply ๋ฉ”์„œ๋“œ์˜ ํ™œ์šฉ

์œ ์‚ฌ๋ฐฐ์—ด๊ฐ์ฒด์— ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ๋ฅผ ์ ์šฉ

์ƒ์„ฑ์ž ๋‚ด๋ถ€์—์„œ ๋‹ค๋ฅธ ์ƒ์„ฑ์ž ํ˜ธ์ถœ

์—ฌ๋Ÿฌ ์ธ์ˆ˜๋ฅผ ๋ฌถ์–ด ํ•˜๋‚˜์˜ ๋ฐฐ์—ด๋กœ ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ apply ํ™œ์šฉ

2-4 bind ๋ฉ”์„œ๋“œ

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

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

var obj = {
  outer: function() {
    console.log(this) //{outer: ฦ’, outer2: ฦ’}
    var innerFunc = function() {
      console.log(this) //{outer: ฦ’, outer2: ฦ’}
    }
    innerFunc.call(this) //POINT
  },

  outer2: function() {
    console.log(this) //{outer: ฦ’, outer2: ฦ’}
    var innerFunc = function() {
      console.log(this) //{outer: ฦ’, outer2: ฦ’}
    }.bind(this) //POINT
    innerFunc()
  },

  outer3: function() {
    console.log(this) //{outer: ฦ’, outer2: ฦ’}
    var innerFunc = function() {
      console.log(this) // window{...}
    } //POINT
    innerFunc()
  },
}

obj.outer()
obj.outer2()
obj.outer3()

2-5 arrow function์˜ ์˜ˆ์™ธ์‚ฌํ•ญ

  • "this๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜" ๋ชฉ์ฐจ ์ฐธ๊ณ 

2-6 ๋ณ„๋„์˜ ์ธ์ž๋กœ this๋ฅผ ๋ฐ›๋Š” ๊ฒฝ์šฐ(์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด์—์„œ์˜ this)

var report = {
  sum: 0,
  count: 0,
  add: function() {
    var args = Array.prototype.slice.call(arguments)
    args.forEach(function(arg, idx) {
      debugger //idx๊ฐ€ 0์ผ๋•Œ this -> {sum: 0, count: 0, add: ฦ’, average: ฦ’}    :report ๊ฐ์ฒด
      this.sum += arg
      ++this.count
    }, this) //POINT
  },
  average: function() {
    return this.sum / this.count
  },
}

report.add(10, 20, 30)
console.log({ sum: report.sum, count: report.count, average: report.average() })
//{sum: 60, count: 3, average: 20}
  • ๋งŒ์•ฝ ์œ„ ์ฝ”๋“œ์—์„œ POINT ๋ถ€๋ถ„ forEach function์— ๋‘๋ฒˆ์งธ parameter "thisArg"๊ฐ€ ์—†์—ˆ๋‹ค๋ฉด this.sum += entry;์—์„œ this๋Š” window๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ธฐ ๋•Œ๋ฌธ์— console.log ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

    {sum: 0, count: 0, average: NaN}

  • ์ฝœ๋ฐฑํ•จ์ˆ˜์™€ ํ•จ๊ป˜ thisArg๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” ๋ฉ”์„œ๋“œ
    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(callback[, thisArg]);
    Set.prototype.forEach(callback[, thisArg]);
    Map.prototype.forEach(callback[, thisArg]);

์ฐธ๊ณ 

  • ์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ - ์œ„ํ‚ค๋ถ์Šค
  • ์ธ์‚ฌ์ด๋“œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์™„๋ฒฝ ๊ฐ€์ด๋“œ
jyoon

ํ’€ ์Šคํƒ ๊ฐœ๋ฐœ์ž๋ฅผ ์ง€ํ–ฅํ•˜๋ฉฐ ์ •์ง„ ํ•˜๊ณ  ์žˆ๋Š” 5๋…„์ฐจ ๊ฐœ๋ฐœ์ž ์œค์žฌ์œค์ž…๋‹ˆ๋‹ค.

TABLE OF CONTENTS