JS - this๋ž€?

๊น€์ •์ธยท2022๋…„ 12์›” 18์ผ
0

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
5/6
post-thumbnail

๐Ÿ“ŒJavaScript์—์„œ this


this๋ž€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ƒ์„ฑ๋˜๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ž€ ์‹คํ–‰ํ•  ์ฝ”๋“œ์— ์ œ๊ณตํ•  ํ™˜๊ฒฝ ์ •๋ณด๋“ค์„ ๋ชจ์•„๋†“์€ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. (ex. window, global ..)

JavaScript๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœํ–ˆ๋Š”๊ฐ€์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ this๊ฐ€ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

  • ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ํ˜ธ์ถœ์‹œ this



๐Ÿค” ์ „์—ญ๊ณต๊ฐ„์—์„œ์˜ this


์ „์—ญ๊ณต๊ฐ„์—์„œ์˜ this๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. (๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ๋Š” window, NodeJS ํ™˜๊ฒฝ์—์„œ๋Š” global)
this.a์™€ window.a์˜ ๊ฐ’์ด 100์œผ๋กœ ๊ฐ™์€ ์ด์œ ๋Š” JS์˜ ๋ชจ๋“  ๋ณ€์ˆ˜๋Š” ์‹ค์€ ํŠน์ • ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. (์ „์—ญ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด JS์—”์ง„์€ ์ด๋ฅผ ์ „์—ญ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋กœ ํ• ๋‹น)



๐Ÿค” ๋ฉ”์„œ๋“œ ๋˜๋Š” ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœํ•  ๋•Œ ๋‚ด๋ถ€์—์„œ์˜ this


๐Ÿ”Ž ์ผ๋‹จ ๋ฉ”์„œ๋“œ์™€ ํ•จ์ˆ˜์˜ ์ฐจ์ด๋Š” ?

  • ํ•จ์ˆ˜๋Š” ๊ทธ ์ž์ฒด๋กœ ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฉ”์„œ๋“œ๋Š” ์ž์‹ ์„ ํ˜ธ์ถœํ•œ ๋Œ€์ƒ ๊ฐ์ฒด์— ๊ด€ํ•œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ์•ž์— ์ (.)์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋งŒ์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌ๋ถ„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

    • ์ (.) ์•ž์— ๊ฐ์ฒด๊ฐ€ ๋ช…์‹œ๋˜๋ฏ€๋กœ, ์ ์ด ์žˆ์œผ๋ฉด ๋ฉ”์„œ๋“œ ์—†์œผ๋ฉด ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

๐Ÿ”Ž ๋ฉ”์„œ๋“œ๋กœ ํ˜ธ์ถœํ•  ๋•Œ ๊ทธ ๋‚ด๋ถ€์—์„œ์˜ this

  • ํ˜ธ์ถœํ•œ ์ฃผ์ œ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊น๋‹ˆ๋‹ค.

  • ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ๋ฉ”์„œ๋“œ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ ํ˜ธ์ถœ์˜ ์ฃผ์ฒด๋Š” ๋ฐ”๋กœ ํ•จ์ˆ˜๋ช… ์•ž์˜ ๊ฐ์ฒด ์ž…๋‹ˆ๋‹ค. ์ฆ‰, this๋Š” ๋งˆ์ง€๋ง‰ ์  ์•ž์— ๋ช…์‹œ๋œ ๊ฐ์ฒด๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

    • ๋”ฐ๋ผ์„œ ์˜ˆ์ œ์—์„œ
      obj.methodA() ์—์„œ ํ˜ธ์ถœ์˜ ์ฃผ์ฒด๋Š” obj์ด๋ฉฐ,
      obj.inner.methodB() ์—์„œ ํ˜ธ์ถœ์˜ ์ฃผ์ฒด๋Š” obj.inner ์ž…๋‹ˆ๋‹ค.

๐Ÿ”Ž ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•  ๋•Œ ๊ทธ ๋‚ด๋ถ€์—์„œ์˜ this

  • ํ•จ์ˆ˜(์˜ˆ์ œ์—์„œ innerFunc)๋กœ ํ˜ธ์ถœํ•  ๋•Œ this๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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


๐Ÿค” ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ๋‚ด๋ถ€์—์„œ์˜ this


  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์—, this๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ „์—ญ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

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


๐Ÿค” ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this


  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ž€ ์–ด๋–ค ๊ณ ํ†ต ์„ฑ์งˆ์„ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๋“ค์„ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž๋ฅผ ํด๋ž˜์Šค(class), ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ๋งŒ๋“  ๊ฐ์ฒด๋ฅผ ์ธ์Šคํ„ด์Šค(instance)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  • JavaScript๋Š” ํ•จ์ˆ˜์— ์ƒ์„ฑ์ž๋กœ์„œ์˜ ์—ญํ• ์„ ํ•จ๊ป˜ ๋ถ€์—ฌํ–‡์Šต๋‹ˆ๋‹ค.

    • new ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ์ž๋กœ ๋™์ž‘ํ•˜์—ฌ ์ธ์Šคํ„ด์Šค ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋•Œ ๋‚ด๋ถ€์—์„œ์˜ this๋Š” ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง„ ์ธ์Šคํ„ด์Šค ์ž์‹ ์ด ๋ฉ๋‹ˆ๋‹ค.
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด

    1. ์ƒ์„ฑ์ž์˜ prototype ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๋Š” _ _proto__ ๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    2. ๋ฏธ๋ฆฌ ์ค€๋น„๋œ ๊ณตํ†ต ์†์„ฑ ๋ฐ ๊ฐœ์„ฑ์„ ํ•ด๋‹น ๊ฐ์ฒด(this)์— ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.


๐Ÿค” ์ด๋ฒคํŠธ ๋ฆฌ์Šคํ„ฐ ํ˜ธ์ถœ์‹œ this


#("btn").click(function(){
    console.log(this); // this๋Š” #btn
})
  • ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์—์„œ์˜ this๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œ๊ธด ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.


๐Ÿ“Œ ๋ช…์‹œ์ ์œผ๋กœ this ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ


๐Ÿ”Ž call ๋ฉ”์„œ๋“œ

func.call(thisArg[, arg1[, arg2[, ...]]])
var obj = {
    a: 1,
    method: function(x, y) {
        console.log(this.a, x, y);
    }
};

obj.method(2, 3);		// 1 2 3
obj.method.call({a: 4}, 5, 6);	// 4 5 6
  • call ๋ฉ”์„œ๋“œ๋Š” ๋ฉ”์„œ๋“œ์˜ ํ˜ธ์ถœ ์ฃผ์ฒด์ธ ํ•จ์ˆ˜๋ฅผ ์ฆ‰์‹œ ์‹คํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๋ช…๋ น์–ด๋กœ, ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋ฅผ this๋กœ ๋ฐ”์ธ๋”ฉํ•˜๊ณ , ์ดํ›„์˜ ์ธ์ž๋“ค์„ ํ˜ธ์ถœํ•  ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ •ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”Ž apply ๋ฉ”์„œ๋“œ

func.apply(thisArg, [argsArray])
var obj = {
    a: 1,
    method: function(x, y) {
        console.log(this.a, x, y);
    }
};

obj.method(2, 3);			// 1 2 3
obj.method.apply({a: 4}, [5, 6]);	// 4 5 6
  • apply ๋ฉ”์„œ๋“œ๋Š” ๋‘ ๋ฒˆ์งธ ์ธ์ž๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ›์•„ ๊ทธ ๋ฐฐ์—ด์˜ ์š”์†Œ๋“ค์„ ํ˜ธ์ถœํ•  ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์™ธ๋Š” call ๋ฉ”์„œ๋“œ์™€ ์™„์ „ํžˆ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”Ž bind ๋ฉ”์„œ๋“œ

func.bind(thisArg[, arg1[, arg2[, ...]]])
var func = function(a, b, c, d) {
    console.log(this, a, b, c, d);	// Window {...} 1 2 3 4
};
func(1, 2, 3, 4);

var bindFunc = func.bind({x: 1});
bindFunc(5, 6, 7, 8);			// {x: 1} 5 6 7 8
  • bind ๋ฉ”์„œ๋“œ๋Š” call๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ์ฆ‰์‹œ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ๋„˜๊ฒจ๋ฐ›์€ this ๋ฐ ์ธ์ˆ˜๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ ์ž…๋‹ˆ๋‹ค. (ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ  ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ)


๐Ÿ“ข ์ •๋ฆฌ !


  • JavaScript์˜ this

    • ์ „์—ญ๊ณต๊ฐ„์—์„œ์˜ this : ์ „์—ญ๊ฐ์ฒด (window, global..)

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

      • ๋ฉ”์„œ๋“œ : ํ•จ์ˆ˜๋ช… ์•ž์˜ ๊ฐ์ฒด. ์ฆ‰, ๋งˆ์ง€๋ง‰ ์  ์•ž์— ๋ช…์‹œ๋œ ๊ฐ์ฒด

      • ํ•จ์ˆ˜ : this๋ฅผ ์ง€์ •ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ์ „์—ญ๊ฐ์ฒด

    • ์ฝœ๋ฐฑํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this : ํ•จ์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ this๋ฅผ ์ง€์ •ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ์ „์—ญ๊ฐ์ฒด

    • ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this : ๋งŒ๋“ค์–ด์ง„ ์ธ์Šคํ„ด์Šค ์ž์‹ 

    • ์ด๋ฒคํŠธ ๋ฆฌ์Šคํ„ฐ ํ˜ธ์ถœ์‹œ this : ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œ๊ธด ๊ฐ์ฒด

  • ๋ช…์‹œ์ ์œผ๋กœ this ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ

    • call

    • apply

    • bind


๐Ÿ”— ์ฐธ๊ณ ํ•œ ๊ธ€


this๊ฐ€ ๋ญ์•ผ?
[Javascript] this์™€ ๋ฐ”์ธ๋”ฉ
ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ๊ฒฐ์ •๋˜๋Š” this

profile
FE ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€