Logo
Hyunsu Blog
this

๐Ÿ“†Published :Nov 4, 2023 โ€ข

๐Ÿ“†Updated :Nov 4, 2023 โ€ข

โ˜•๏ธ3min

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ์˜ this

๋“ค์–ด๊ฐ€๋ฉด์„œ

๋Œ€๋ถ€๋ถ„์˜ ์ฐธ๊ณ  ์„œ์ ์—์„œ this๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ์™€ ํ•จ๊ป˜ this๋ฅผ ์„ค๋ช…ํ•˜์ฃ . this๋ฅผ ์•Œ๊ณ ์‹ถ์€๋ฐ ์ž๊พธ๋งŒ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ๋ฐฉ์‹์„ ์ด์•ผ๊ธฐ ํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ํ˜น์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์™œ ์ค‘์š”ํ• ๊นŒ์š”?

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•จ์ˆ˜์™€ ํ•จ์ˆ˜ํ˜• ์–ธ์–ดํŠน์ง•์ด ์ค‘์š”ํ•œ ์ด์œ  ์ค‘ ํ•˜๋‚˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰์˜ ๊ธฐ๋ณธ ๋ชจ๋“ˆ ๋‹จ์œ„์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋งˆํฌ์—…์ด ํ‰๊ฐ€๋˜๋Š”๋™์•ˆ ์‹คํ–‰๋˜๋Š” ์ธ๋ผ์ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ œ์™ธํ•˜๋ฉด,(์›น) ํŽ˜์ด์ง€์—์„œ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“ค์–ด์ง„ ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ๋Š” ํ•จ์ˆ˜์•ˆ์—์„œ ์‹คํ–‰ ๋  ๊ฒƒ์ด๋‹ค. Secrets of the JavaScript Ninja ์ฑ… ์ธ์šฉ

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

๋ณธ๊ฒฉ์ ์œผ๋กœ this์— ๋Œ€ํ•ด

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ๋ฐฉ์‹์€

  1. ์ „์—ญ๊ณต๊ฐ„์—์„œ์˜ ํ˜ธ์ถœ
  2. ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ
  3. ๋ฉ”์„œ๋“œ๋กœ ํ˜ธ์ถœ
  4. ์ƒ์„ฑ์ž๋กœ ํ˜ธ์ถœ
  5. ํ•จ์ˆ˜์˜ apply()๋‚˜ call()๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœ ๐Ÿ‘ˆ 3. ๋ฉ”์„œ๋“œ๋กœ ํ˜ธ์ถœ์—์„œ ๊ฐ™์ด ๋‹ค๋ค„์š”.
  6. callbackํ˜ธ์ถœ ๐Ÿ‘ˆ ํ˜„์žฌํฌ์ŠคํŒ…์—์„  ๋‹ค๋ฃจ์ง€ ์•Š๊ณ , ๋‹ค์Œ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…์œผ๋กœ ์ž์„ธํ•˜๊ฒŒ ์†Œ๊ฐœํ• ๊ฒŒ์š”.

์ด๋ ‡๊ฒŒ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”๋ฐ์š”. ์•ž์œผ๋กœ ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณผ๊ฒŒ์š”.

1. ์ „์—ญ ๊ณต๊ฐ„ ์—์„œ์˜ ํ˜ธ์ถœ

์ด๋Š” ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ this๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์„ ๋งํ•ด์š” node์˜ ๊ฒฝ์šฐ global, browser์˜ ๊ฒฝ์šฐ window ๊ฐ€ this๊ฐ€ ๋˜์š”.

2. ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ

ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ์ด๋ผ๋Š” ์˜๋ฏธ๊ฐ€ ์ฒ˜์Œ์—” ์ „ ์ž˜ ์™€๋‹ฟ์ง€ ์•Š์•˜์–ด์š”. ํ•จ์ˆ˜๋กœ๋ผ๋Š” ํ˜ธ์ถœ์ด ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•˜๋Š”๋ฐ ๋ญ”๊ฐ€ ์ด์ƒํ–ˆ์ฃ . ์ฑ…์—์„œ ์•Œ๊ฒŒ๋œ ์‚ฌ์‹ค์ธ๋ฐ, ๋งŒ์•ฝ ๋ฉ”์„œ๋“œ๋‚˜ ์ƒ์„ฑ์ž ๋˜๋Š” apply(), call()์„ ํ†ตํ•ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ์ด๋ผ๊ณ  ํ•œ๋Œ€์š”. ์—ฌํŠผ ํ•จ์ˆ˜๋กœ์˜ ํ˜ธ์ถœ์€ () ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ˜ธ์ถœ ํ•ด์š”. ์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•˜์˜€๊ณ  ํ•จ์ˆ˜ ๋‚ด์—์„œ this ๊ฐ€ ๋ˆ„๊ตฐ์ง€ ๋ฌผ์–ด๋ณด๋ฉด this๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

const getThis = ()=>{ return this } console.log(getThis()) //๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰์‹œ - window, nodeํ™˜๊ฒฝ์—์„œ ์‹คํ–‰์‹œ - global

์ด ํ•จ์ˆ˜๋กœ์„œ์˜ ํ˜ธ์ถœ์€ ์ข…์ข… ๋‹ค์Œ์— ์„ค๋ช…๋  ๋ฉ”์„œ๋“œ๋กœ์„œ ํ˜ธ์ถœ๊ณผ ๋น„๊ต๊ฐ€ ๋งŽ์ด ๋˜๋‹ˆ, ๊ณ„์† ์ด์–ด๊ฐˆ๊ฒŒ์š”.

3. ๋ฉ”์„œ๋“œ๋กœ์„œ ํ˜ธ์ถœ

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

function getThis(){ return this; } assert(getThis() === global); // true, ํ•จ์ˆ˜๋กœ์„œ์˜ ํ˜ธ์ถœ const definitionOfThis = getThis; assert(definitionOfTHIS() === global) // true, ํ•จ์ˆ˜๋กœ์„œ์˜ ํ˜ธ์ถœ const me={ learning : getThis; } assert(me.learning() === me) //true,๋ฉ”์„œ๋“œ๋กœ์„œ์˜ ํ˜ธ์ถœ

์œ„์˜ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ๋ฉ”์„œ๋“œ๋กœ์„œ์˜ ํ˜ธ์ถœ๊ณผ ํ•จ์ˆ˜๋กœ์„œ์˜ ํ˜ธ์ถœ์„ ์‰ฝ๊ฒŒ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ์–ด์š”. ๊ฐ์ฒด ๋‚ด์˜ ํ”„๋กœํผํ‹ฐ . ์„ ์ด์šฉํ•ด ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜๋Š” ๋ฉ”์„œ๋“œ๋กœ์„œ์˜ ํ˜ธ์ถœ๋กœ this๋Š” ๊ทธ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์ฃ .

์ด ์˜ˆ์ œ์—์„œ ์ง„์งœ ๋งํ•˜๊ณ ์ž ํ•˜๋Š”๊ฑด getThis ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ์ •์˜ ๋˜์—ˆ๋Š”์ง€๊ฐ€ ๊ด€์‹ฌ์ด ์•„๋‹ˆ๋ผ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœ ํ•˜๊ณ  ์žˆ๋Š๋ƒ์— ๋”ฐ๋ผ this๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค๋Š” ์ ์ด์—์š”.

๊ทธ๋Ÿฐ๋ฐ ํ•จ์ˆ˜๋กœ์„œ์˜ this๋Š” ์ „์—ญ๊ฐ์ฒด๋งŒ ๋ณด๊ณ  ์žˆ๋‹ค๋Š”๊ฒŒ ํ•œ๊ณ„์ ์ธ๋ฐ์š”. ๊ทธ๋Ÿผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ˆ์ œ์—์„œ innerMethod2๋ฅผ ํ˜ธ์ถœ ํ–ˆ์„ ๋•Œ exampleObj๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•  ์ˆœ ์—†์„๊นŒ์š”?

var exampleObj = { outerFunc: function() { console.log(this); // 1. this -> exampleObj var innerMethod1 = function() { console.log(this); //2. this->window }; innerMethod1(); var innerMethod2= function() { console.log(this); //3. this->window } innerMethod2(); } }; exampleObj.outerFunc();

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ธ๊ฐ€์ง€ ์ •๋„์˜ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”.

  1. ๋ณ€์ˆ˜์— this๋ฅผ ํ• ๋‹นํ•˜์—ฌ ๊ทธ ๋ณ€์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ๋ฒ•
  2. es6 ์˜ arrow function ํ™œ์šฉ ๋ฐฉ๋ฒ•.
  3. ๋ช…์‹œ์ ์œผ๋กœ call, apply ํ™œ์šฉํ•˜์—ฌ this์ง€์ • ํ•˜๋Š” ๋ฐฉ๋ฒ•

1. ๋ณ€์ˆ˜์— this๋ฅผ ํ• ๋‹นํ•˜์—ฌ ๊ทธ ๋ณ€์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ๋ฒ•

exampleObj.outerFunc() ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ์˜ํ•ด outerFuncํ•จ์ˆ˜ ๋‚ด์—์„œ๋Š” this๋Š” exampleObj๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ์ ์„ ํ™œ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•œ ํ›„, ๊ทธ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.

var exampleObj = { outerFunc: function() { console.log(this); // 1. this -> exampleObj {outerFunc: ฦ’} var innerMethod1 = function() { console.log(this); //2. this->window }; innerMethod1(); var exampleObjThis = this; โœ… ์ฐธ์กฐ var innerMethod2= function() { console.log(exampleObjThis); // exampleObj {outerFunc: ฦ’} โœ… ์šฐํšŒ์ ์œผ๋กœ ๋ณ€๊ฒฝ } innerMethod2(); } }; exampleObj.outerFunc();

2. es6 ์˜ arrow function ํ™œ์šฉ ๋ฐฉ๋ฒ•. es6 ๋ถ€ํ„ฐ ๋„์ž…๋œ arrow function์€ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ(=์‹คํ–‰์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ, ํ™œ์„ฑํ™”) this binding์„ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์œ„์Šค์ฝ”ํ”„์˜ this๋ฅผ ์ƒ์†์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var exampleObj = { outerFunc: function() { console.log(this); // 1. this -> exampleObj var innerMethod1 = function() { console.log(this); //2. this->window }; innerMethod1(); var innerMethod2=()=> { โœ… ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์‚ฌ์šฉ console.log(this); //3. this->window } innerMethod2(); } }; exampleObj.outerFunc();

3. ๋ช…์‹œ์ ์œผ๋กœ call, apply ํ™œ์šฉํ•˜์—ฌ this์ง€์ • ํ•˜๋Š” ๋ฐฉ๋ฒ•

์‚ฌ์‹ค call, apply๋Š” ํ•จ์ˆ˜๋กœ์„œ์˜ ํ˜ธ์ถœ ์ผ ๋•Œ ๋ฟ ์•„๋‹ˆ๋ผ, ๊ทธ๋ƒฅ ๋ช…์‹œ์ ์œผ๋กœ this๋ฅผ ์ง€์ •ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ƒํ™ฉ์— ๊ตฌ์•  ๋ฐ›์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

call๊ณผ apply๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํ˜•์‹์ด ๋‹ค๋ฅด๋ฏ€๋กœ ์ด ๋ถ€๋ถ„์„ ์œ ์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

call

call(thisArg, arg1, arg2, / โ€ฆ, / argN)

  • thisArg ์— this๋กœ ์‚ฌ์šฉํ•  ๊ฐ’์„ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ์—„๊ฒฉ ๋ชจ๋“œ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ null ๋ฐ undefined๋Š” ์ „์—ญ ๊ฐœ์ฒด๋กœ ๋Œ€์ฒด๋˜๊ณ  ๊ธฐ๋ณธ ๊ฐ’์€ ๊ฐœ์ฒด๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.
var exampleObj = { outerFunc: function() { console.log(this); // 1. this -> exampleObj var innerMethod1 = function() { console.log(this); //2. this->window }; innerMethod1(); var innerMethod2=function(){ console.log(this); //3. this -> exampleObj } innerMethod2.call(this); //โœ… call method์‚ฌ์šฉ } }; exampleObj.outerFunc();

apply

์œ„์—์„œ ์ž ๊น ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ, call๊ณผ apply์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ํ˜•์‹์ด ์กฐ๊ธˆ ๋‹ค๋ฅธ๋ฐ์š”. thisArg ๋Š” call๊ณผ ๋™์ผํ•ด์š”. argsArray ๋Š” ํ•จ์ˆ˜ ์ธ์ž๋“ค์„ array์— ๋‹ด์•„์•ผ ํ•จ์„ ์˜๋ฏธํ•ด์š”. ํ˜„์žฌ ํฌ์ŠคํŒ…์—์„  this๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์“ฐ๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃจ๊ณ  ์žˆ์œผ๋‹ˆ, call๊ณผ apply์˜ ์šฉ๋ฒ•์— ๋Œ€ํ•œ ๋ถ€๋ถ„์€ MDN call ํ™œ์šฉ๋ฒ•, MDN apply ํ™œ์šฉ๋ฒ•์œผ๋กœ ๋‚จ๊ฒจ๋‘˜๊ฒŒ์š”.

apply(thisArg) apply(thisArg, argsArray)

var exampleObj = { outerFunc: function() { console.log(this); // 1. this -> exampleObj var innerMethod1 = function() { console.log(this); //2. this->window }; innerMethod1(); var innerMethod2=function(){ console.log(this); //3. this -> exampleObj } innerMethod2.apply(this); //โœ… apply method์‚ฌ์šฉ } }; exampleObj.outerFunc();

4. ์ƒ์„ฑ์ž๋กœ ํ˜ธ์ถœ

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

function Toy(name, color) { this.name = name; this.color = color; this.describe = function() { console.log("This is a " + this.color + " toy named " + this.name + "."); }; } var teddyBear = new Toy('Teddy Bear', 'brown'); teddyBear.describe(); // "This is a brown toy named Teddy Bear." var raceCar = new Toy('Race Car', 'red'); raceCar.describe(); // "This is a red toy named Race Car."

์œ„์˜ ์˜ˆ์‹œ์—์„œ Toy ํ•จ์ˆ˜๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. new ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Toy์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ, JavaScript ์—”์ง„์€ this๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด, ์ฆ‰ teddyBear์™€ raceCar์— ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค. this.name๊ณผ this.color๋Š” ๊ฐ๊ฐ์˜ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ๊ณ ์œ ํ•œ ์†์„ฑ ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

teddyBear.describe()๋‚˜ raceCar.describe()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, ๊ฐ๊ฐ์˜ this๋Š” ํ˜ธ์ถœ๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ์†ํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฏ€๋กœ, describe ๋ฉ”์„œ๋“œ๋Š” ๊ฐ ๊ฐ์ฒด์˜ name๊ณผ color ์†์„ฑ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฐธ์กฐํ•˜์—ฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

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

์ •๋ฆฌํ•˜๋ฉฐ

์ด์ „ ์‹คํ–‰์ปจํ…์ŠคํŠธ ํฌ์ŠคํŒ…์—์„œ lexical scope ๋ฅผ ๋‹ค๋ฃฐ ๋•, ํ•จ์ˆ˜๊ฐ€ ์–ด๋””์— ์ •์˜ ๋˜๋Š”์ง€๊ฐ€ ๊ด€์‹ฌ์‚ฌ์˜€๋‹ค๋ฉด this์˜ ๊ฒฝ์šฐ๋Š” ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœ๋˜๋Š”์ง€๊ฐ€ ๊ด€์‹ฌ์‚ฌ์ธ ๋ถ€๋ถ„์ด ๋‹ค๋ฅด๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์–ด์š”. ๋ช…์‹œ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” call/apply ๋„ ์ข‹์ง€๋งŒ ๊ฐœ์ธ์ ์œผ๋กœ es6 ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋“  ์—”์ง€๋‹ˆ์–ด ๋ ˆ๋ฒจ์—์„œ ํ†ต์šฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํŽธํ•˜๊ณ , ์ฝ”๋“œ๋„ ๋” ๊น”๋”ํ•˜์ง€ ์•Š์„๊นŒ ํ•ด์š”. ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„  callback์—์„œ this๋ฅผ ์ข€ ๋” ๋‹ค๋ค„๋ณผ๊นŒ ํ•ด์š”.


์ฐธ๊ณ ๋„์„œ

  • ์กด ๋ ˆ์‹, ๋ฒ ์–ด ๋ฐ”์ด๋ณผํŠธ. (2014). ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‹Œ์ž ๋น„๊ธ‰ Secrets of the JavaScript Ninja.์ธ์‚ฌ์ดํŠธ
  • ์ •์žฌ๋‚จ. (2019). ์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ.์œ„ํ‚ค๋ถ์Šค

Hi, I'm Hyunsu ๐Ÿ‘‹

Profile Image

์•ˆ๋…•ํ•˜์„ธ์š”. ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ฃผํ˜„์ˆ˜์ž…๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ํ’๋ถ€ํ•˜๊ณ  ๊ฐ€์น˜ ์žˆ๋Š” ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” ์ผ์— ๋ฟŒ๋“ฏํ•จ์„ ๋Š๋‚๋‹ˆ๋‹ค.

์˜ต์‹œ๋””์–ธ(Obsidian)์—์„œ ํ˜„์žฌ ๋ธ”๋กœ๊ทธ๋กœ ํ•˜๋‚˜์”ฉ ๊ธ€์„ ์˜ฎ๊ธฐ๋Š” ๊ณผ์ •์— ์žˆ์–ด์š”. โ˜•๏ธ ๐Ÿ‘ฉโ€๐Ÿ’ป โ›ท

Github on ViewReach Me Out