๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ“บ Front End/- HTML,css,Javascript

[Javascript-Core] ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this์™€ ์šฐํšŒ ๋ฐฉ๋ฒ• ๊ทธ๋ฆฌ๊ณ  ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์˜ this (๋ถ€์ œ) :: JS์—์„œ ๋งํ•˜๋Š” This์— ์ •ํ™•ํ•œ ์˜๋ฏธ์™€ ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์—์„œ์˜ this(3)

by Wonit 2020. 7. 28.

์˜ค๋Š˜ ์•Œ์•„๋ณผ ๊ฒƒ์€ this์ด๋‹ค.

 

๋‚˜๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด์ธ java๋ฅผ ๋จผ์ € ๋ฐฐ์› ๊ธฐ ๋•Œ๋ฌธ์— js์—์„œ ๋งํ•˜๋Š” this๋ฅผ ๋‹จ์ง€ class ๋‚ด๋ถ€์˜ ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์—ญํ• ๋กœ์จ ์ดํ•ด๋ฅผ ํ–ˆ์—ˆ์ง€๋งŒ, js์—์„œ ๋งํ•˜๋Š” this๋Š” ํ›จ์”ฌ ๋‹ค์–‘ํ•˜๊ณ  ์‹ฌ์˜คํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

 

์˜ค๋Š˜ ๊ทธ ์‹ฌ์˜คํ•œ ๊ธฐ๋Šฅ๋“ค์— ๋Œ€ํ•ด์„œ ์งš์–ด๋ณด์ž.

ํ•ด๋‹น ๊ธ€์€ 4๋ถ€์ž‘์œผ๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. this์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์™„๋ฒฝํžˆ ํŒŒ์•…ํ•˜๊ณ ์‹ถ๋‹ค๋ฉด ํ•œ ๋ฒˆ ๋ด๋ณด๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
  1. ์ „์—ญ ๊ณต๊ฐ„์—์„œ์˜ this
  2. ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ์˜ this
  3. ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this
  4. ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ์˜ this

What is this

w3cschool

 

์ตœ๋Œ€์˜ docs๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” w3c์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด this์˜ ๊ธฐ๋Šฅ์„ ๋ถ„๋ฅ˜ํ•œ๋‹ค.

 

  • ๋ฉ”์„œ๋“œ์—์„œ this๋Š” ๊ทธ์˜ ์ฃผ์ธ ๊ฐ์ฒด(Owner Obj)๋ฅผ ๋œปํ•œ๋‹ค.
  • this๊ฐ€ ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉด ๊ทธ๊ฒƒ์€ global ๊ฐ์ฒด๋ฅผ ๋œปํ•œ๋‹ค.
  • ํ•จ์ˆ˜์—์„œ this๋Š” global ๊ฐ์ฒด๋ฅผ ๋œปํ•œ๋‹ค.
  • strict mode๊ฐ€ ์ ์šฉ๋œ ํ•จ์ˆ˜์—์„œ this๋Š” undefined์ด๋‹ค.
  • ์ด๋ฒคํŠธ์—์„œ this๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›๋Š” element๋ฅผ ๋œปํ•œ๋‹ค.
  • call()๊ณผ apply() ๊ฐ™์€ ๋ฉ”์„œ๋“œ์—์„œ this๋Š” any object๋ฅผ ๋œปํ•œ๋‹ค.

๊ฐ๊ฐ์˜ ์˜ˆ๋ฅผ ํ†ตํ•ด์„œ ์กฐ๊ธˆ ์‰ฝ๊ฒŒ ์ดํ•ดํ•ด๋ณด์ž.

 

๋ชจ๋“  ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•˜๋Š”๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค.

 

๋‹จ์ˆœํžˆ ์•”๊ธฐ๋ฅผ ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋‹น์žฅ์€ ํšจ๊ณผ์ ์ผ์ง€ ๋ชจ๋ฅด๊ฒ ์œผ๋‚˜ ์–ธ์ œ ์–ด๋–ค ์–ธ์–ด๊ฐ€ ์–ด๋–ป๊ฒŒ ์‚ฌ๋ผ์ง€๊ณ  ๋“ฑ์žฅํ• ์ง€ ๋ชจ๋ฅด๋Š” ํ˜„์žฌ์—๋Š” ์–ธ์–ด์˜ ์‚ฌ์šฉ๋ฒ•๋ณด๋‹จ ์ปดํ“จํŒ…์  ์‚ฌ๊ณ ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค.


ํ•จ์ˆ˜๋Š” ์ง€๋‚œ ์‹œ๊ฐ„์— ์ด์•ผ๊ธฐํ–ˆ๋“ฏ์ด 2๊ฐ€์ง€์˜ ํ˜•ํƒœ๋ฅผ ๋ˆ๋‹ค

  1. ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋กœ์จ์˜ ํ•จ์ˆ˜
  2. ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ํ•จ์ˆ˜์ธ ๋ฉ”์„œ๋“œ

์ด 2๊ฐ€์ง€ ํ˜•ํƒœ์˜ this๋ฅผ ํŒŒ์•…ํ•ด๋ณด์ž.

๋จผ์ €

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

๊ฒฐ๋ก ์„ ๋จผ์ € ์ด์•ผ๊ธฐ ํ•œ๋‹ค๋ฉด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋Š” this๊ฐ€ ์ง€์ •์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ์ฒด๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋‹ค๊ณ  ์ด์•ผ๊ธฐ ํ–ˆ์—ˆ๋Š”๋ฐ, ์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ์กฐ์ฐจ๋„ ๊ฐ์ฒด ์œ„์—์„œ ๋Œ์•„๊ฐ€๊ฒŒ ๋œ๋‹ค.

 

์ •๋ง ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋ฅผ ๋ด๋ณด์ž.

let a = 10;

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•ด ์ž˜ ์ดํ•ด๋ฅผ ํ•˜๊ณ  ์žˆ๊ฑฐ๋‚˜, ๋‚ด ๊ธ€์„ ์ž˜ ๋”ฐ๋ผ์˜จ ์‚ฌ๋žŒ๋“ค์€ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ๋Š” ์งˆ๋ฌธ์„ ํ•˜๋‚˜ ํ•ด๋ณด์ž๋ฉด

์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ๋ฌด์—‡์ผ๊นŒ์š”?

์ •๋‹ต์ด๋‹ค. ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๊ฐ์ฒด๋Š” window๊ฐ์ฒด๋ฅผ ๋œปํ•œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ a๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” window.a๋‚˜ global.a(node ํ™˜๊ฒฝ)๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” ๋ชจ๋‘ ๋‹ค ๊ฐ™๋‹ค๊ณ  ํ–ˆ๋‹ค.

๊ทธ๋Ÿผ

function a() { }

๋Š” ์–ด๋–จ๊นŒ?

 

๋‹น์—ฐํžˆ window.a๋‚˜ global.a(node ํ™˜๊ฒฝ)๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์ด๋‹ค.


๊ทธ๋Ÿผ ์ฒ˜์Œ์— ์ด์•ผ๊ธฐ ํ–ˆ๋“ฏ์ด, this๊ฐ€ ์ง€์ •์ด ๋˜์ง€ ์•Š์œผ๋ฉด?? ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๋ฐ”๋ผ๋ณธ๋‹ค๋ผ๊ณ  ํ–ˆ์œผ๋‹ˆ ํ•จ์ˆ˜์—์„œ์˜ this๋Š” ์ „์—ญ ๊ฐ์ฒด๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ ์ด์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด๋‹ค.

๋ฉ”์„œ๋“œ๋กœ์จ์˜ ํ•จ์ˆ˜์˜ this

๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ์ •์˜ํ•˜๊ณ  ์‹คํ–‰ํ•œ ํ•จ์ˆ˜๋Š” ์ง€๋‚œ ๊ธ€์„ ์ž˜ ์ดํ•ดํ–ˆ๋‹ค๋ฉด ๋ฐ”๋กœ ์ดํ•ด๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.


๋ฉ”์„œ๋“œ๋กœ์จ์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์•„๋งˆ

console.log(Obj.method())

ํ˜•ํƒœ๋กœ ํ˜ธ์ถœ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.


๊ทธ๋Ÿผ method์—์„œ ๋งํ•˜๋Š” this๋Š” Obj๋ผ๋Š” ๊ฐ์ฒด๊ฐ€ ๋œ๋‹ค.


๊ทธ ์ด์œ ๋Š” ์šฐ๋ฆฌ๊ฐ€ .์—ฐ์‚ฐ์ž๋ฅผ ๋งŒ๋‚˜๋ฉด ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋œป์ด๋‹ˆ ๊ฐ์ฒด ์ž์ฒด๊ฐ€ ํ•˜๋‚˜์˜ ์‹คํ–‰ ๋ฌธ๋งฅ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

var obj = {
  outer : function() {
    console.log(this);
  }
}

console.log(obj.outer);

๊ทธ๋Ÿผ ์—ฌ๊ธฐ์„œ๋Š” ์ถœ๋ ฅ์˜ ๊ฒฐ๊ณผ๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

 

๊ทธ๋ ‡๋‹ค. ๋ฐ”๋กœ obj๊ฐ€ ๋œ๋‹ค.

 

๊ทธ๋Ÿผ

    outer: function () {
        console.log(this);

        var innerFunc = function () {
            console.log(this);
        }
        innerFunc();

        var obj2 = {
            innerMethod: innerFunc
        };
        obj2.innerMethod();
    }
}

obj.outer();

์˜ ๊ฒฐ๊ณผ๋Š”

  • obj1 window obj2.innerMethod
  • window window obj2.innerMethod
  • window window window

๋ฌด์—‡์ผ๊นŒ?

 

๊ทธ๋ ‡๋‹ค

 

๋ฐ”๋กœ obj1 window obj2.innerMethod๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋ ‡์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ €๊ธฐ์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  this๋Š” ํ•˜๋‚˜์˜ this๋งŒ ๊ฐ€๋ฆฌํ‚ค๊ธธ ์›ํ•œ๋‹ค.

 

๊ฐœ๋ฐœํ•  ๋•Œ, ํ•˜๋‚˜์˜ ๋ธ”๋ก ์Šค์ฝฎ์—์„œ ์–ด๋–ค this๋Š” window๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์–ด๋–ค this๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค๋ฉด ํ•ด๋‹น ์ฝ”๋“œ๋Š” ์˜๋„์ ์œผ๋กœ ๋Œ์•„๊ฐ€์ง€ ์•Š์„ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” this๋ฅผ ์œ„ํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„์•ผ ํ•œ๋‹ค.

 

ํ•˜์ง€๋งŒ ์•„์‰ฝ๊ฒŒ๋„ ํ˜„์žฌ๊นŒ์ง€ this๋ฅผ ์šฐํšŒํ•˜๋Š” ์ž์ฒด ๊ธฐ๋Šฅ์€ ์—†๋‹ค. (๊ทน์ ์ธ ์—ฐ์ถœ์„ ์œ„ํ•œ ๋ฐ‘๊ทธ๋ฆผ...์‚ฌ์‹ค Ecmascript5๊นŒ์ง„ ์—†์—ˆ๋Š”๋ฐ 6์— ์ƒ๊ฒผ์–ด์š”..)

 

๊ทธ๋ ‡์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•œ๋‹ค๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ์ € ์ด์ƒํ•œ ์ƒํ™ฉ์„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ฐ”๋กœ log๋ฅผ ์ฐ์„ ๋•Œ this๋กœ ์ฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•˜๋‚˜์˜ this๋ฅผ ๋ณ€์ˆ˜๋กœ ๋งŒ๋“ค๊ณ  ๋ชจ๋‘ ๊ทธ ๋ณ€์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๊ฒŒ ํ•˜๋ฉด ๋œ๋‹ค.

var obj = {
    outer: function () {
        console.log(this);

        var innerFunc = function () {
            console.log(this);
        }
        innerFunc();

        var self = this;
        var innerFunc2 = function () {
            console.log(self);
        }
    }
}
obj.outer();

๊ทธ๋Ÿผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

this๋ฅผ ์šฐํšŒํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ• (ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์˜ ๋“ฑ!์žฅ!)

this๋ฅผ ์šฐํšŒํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ณ€์ˆ˜๋ฅผ ์จ์„œ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์ด๋Ÿฐ ๊ณผ์ •๋“ค์ด ๋ถˆํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋Š๋‚€ Ecmascript6 ์„ค๊ณ„์ž๋“ค์€ ์•„์˜ˆ this ๋ฐ”์ธ๋”ฉ์„ ํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค.

 

๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ๊ทธ ์œ ๋ช…ํ•œ

toidicode.com

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์ด๋‹ค.

 

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” LexicalEnvironment์—์„œ thisBinding๊ณผ์ • ์ž์ฒด๊ฐ€ ์ƒ๋žต๋˜์–ด ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ this๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

 

๊ทธ๋ž˜์„œ ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ„๋‹จํ•œ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์žฌ๊ตฌ์„ฑํ•œ๋‹ค๋ฉด

var obj = {
    outer: function () {
        console.log(this);
        var innerFunc = () => {
            console.log(this);
        }
        innerFunc();
    }
}
obj.outer();

๊ฐ„๋‹จํ•˜๊ฒŒ this๋ฅผ ์—ฐ๊ฒฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

์ด๋Ÿฐ ๋ฐฉ๋ฒ• ์ค‘์—๋„ apply()๋‚˜ call()๋“ฑ์ด ์žˆ๋Š”๋ฐ, ๊ทธ ๋ถ€๋ถ„์€ ๋‹ค์Œ์— ํ™•์ธํ•ด๋ณด๋„๋ก ํ•˜์ž.

๋Œ“๊ธ€