๋‚ด์ผ๋ฐฐ์›€์บ ํ”„

[JS๋ฌธ๋ฒ•์ข…ํ•ฉ๋ฐ˜3์ฃผ์ฐจ] 250107 TIL

Dana10 2025. 1. 7. 21:00

 

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ™œ์„ฑํ™” ๋˜๋Š” ์‹œ์ ์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•˜๋Š” ์ผ

1. ํ˜ธ์ด์ŠคํŒ…

2. ์™ธ๋ถ€ ํ™˜๊ฒฝ ์ •๋ณด ๊ตฌ์„ฑ

3. this ๊ฐ’ ์„ค์ •

 

์ €๋ฒˆ ๊ฐ•์˜์—๋Š” 1.ํ˜ธ์ด์ŠคํŒ…์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ดค๋‹ค.

์ด๋ฒˆ์—๋Š” 2.์™ธ๋ถ€ ํ™˜๊ฒฝ ์ •๋ณด ๊ตฌ์„ฑ์™€ 3.this ๊ฐ’ ์„ค์ •์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.


1. VariableEnvironment(VE)์™€ LexicalEnvironment(LE)

์šฐ์„  VE์™€ LE์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

์ด ๋‘˜์€ ๋ชจ๋‘ ๋™์ผํ•˜์ง€๋งŒ ์Šค๋ƒ…์ƒท ์œ ์ง€ ์—ฌ๋ถ€๊ฐ€ ๋‹ค๋ฅด๋‹ค.

 

VE๋Š” ์Šค๋ƒ…์ƒท์„ ์œ ์ง€ํ•˜์ง€๋งŒ, LE๋Š” ์Šค๋ƒ…์ƒท์„ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๊ณ„์†ํ•ด์„œ ๋ฐ˜์˜ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

๋”ฐ๋ผ์„œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ VE์— ์ •๋ณด๋ฅผ ๋จผ์ € ๋‹ด์€ ํ›„์— LE๋Š” ์ด๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•˜๊ณ , ๊ทธ ์ดํ›„๋ถ€ํ„ฐ๋Š” LE๋ฅผ ํ™œ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

 

์ž ์ด์ œ ๋” ์ž์„ธํžˆ ์™ธ๋ถ€ ํ™˜๊ฒฝ ์ •๋ณด ๊ตฌ์„ฑ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” environmentRecord(=record)์™€ outerEnvironmentReference(=outer)๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

 

record์—๋Š” ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์™€ ๊ด€๋ จ๋œ ์ฝ”๋“œ์˜ ์‹๋ณ„์ž ์ •๋ณด(ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ์‹๋ณ„์ž, ํ•จ์ˆ˜ ์ž์ฒด, var๋กœ ์„ ์–ธ๋œ ์‹๋ณ„์ž)๊ฐ€ ์ €์žฅ๋œ๋‹ค.

outer์—๋Š” ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ๊ฒจ๋‚  ๋•Œ์˜ ํ™˜๊ฒฝ์ •๋ณด๊ฐ€ ๋‹ด๊ธด๋‹ค.

 

** ๊ฐ๊ฐ์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” LE ์•ˆ์— record์™€ outer๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ,

outer ์•ˆ์—๋Š” ๊ทธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์„ ์–ธ๋  ๋‹น์‹œ์˜ LE์ •๋ณด๊ฐ€ ๋‹ค ๋“ค์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์—

scope chain์— ์˜ํ•ด ์ƒ์œ„ ์ปจํ…์ŠคํŠธ์˜ record๋ฅผ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

 

์•„๋ž˜์˜ ์˜ˆ์‹œ๋ฅผ ์ •๋ฆฌํ•˜๋ฉด์„œ ๊ฐœ๋…์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•ด๋ณด์ž.

 

var a = 1;
var outer = function () {
	var inner = function () {
    	console.log(a); //undefined
        var a = 3;
    };
    inner();
    console.log(a); //1
};
outer();
console.log(a); //1

 

1. ์ฝœ์Šคํƒ์— ์ „์—ญ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

  • ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚˜๊ณ  record์— ์‹๋ณ„์ž ์ •๋ณด๊ฐ€ ๋‹ด๊ธด๋‹ค. ( var a; var outer; )
  • a์— 1์ด ํ• ๋‹น๋˜๊ณ  outer์— ํ•จ์ˆ˜๊ฐ€ ํ• ๋‹น๋œ๋‹ค.
  • outer() ํ•จ์ˆ˜๊ฐ€ ์ฝœ์Šคํƒ์— ์Œ“์ด๋ฉด์„œ ์ „์—ญ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ค‘๋‹จ๋œ๋‹ค.

2. ์ฝœ์Šคํƒ์— outer ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

  • ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚˜๊ณ  record์— ์‹๋ณ„์ž ์ •๋ณด๊ฐ€ ๋‹ด๊ธด๋‹ค. ( var inner; )
  • outer(=outerEnvironmentReference)์˜ ์Šค์ฝ”ํ”„ ์ฒด์ธ์€ ์ „์—ญ ์ปจํ…์ŠคํŠธ์˜ LE๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
  • innerํ•จ์ˆ˜๊ฐ€ ์ฝœ์Šคํƒ์— ์Œ“์ด๋ฉด์„œ outer ํ•จ์ˆ˜๊ฐ€ ์ค‘๋‹จ๋œ๋‹ค.

3. ์ฝœ์Šคํƒ์— inner ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

  • ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚˜๊ณ  record์— ์‹๋ณ„์ž ์ •๋ณด๊ฐ€ ๋‹ด๊ธด๋‹ค. ( var a; )
  • outer(=outerEnvironmentReference)์˜ ์Šค์ฝ”ํ”„ ์ฒด์ธ์€ outer ์ปจํ…์ŠคํŠธ์˜ LE๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
  • ์ฝ˜์†”์— a๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด inner์Šค์ฝ”ํ”„์˜ ๋‚ด๋ถ€์—์„œ ์‹๋ณ„์ž a๋ฅผ ์ฐพ๋Š”๋‹ค.
  • a๋ฅผ ์ฐพ์•˜์ง€๋งŒ ์•„์ง ๊ฐ’์ด ํ• ๋‹น๋˜๊ธฐ ์ „ ์ดˆ๊ธฐ๊ฐ’์ธ undefined๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.
  • a์— 3์ด ํ• ๋‹น๋œ๋‹ค.
  • innerํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  ์ฝœ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋œ๋‹ค.

4. ์ค‘๋‹จ๋˜์—ˆ๋˜ outerํ•จ์ˆ˜๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋œ๋‹ค.

  • ์ฝ˜์†”์— a๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด outer ์Šค์ฝ”ํ”„ ๋‚ด๋ถ€์—์„œ ์‹๋ณ„์ž a๋ฅผ ์ฐพ๋Š”๋‹ค.
  • a์˜ ์ •๋ณด๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„ outer ์ปจํ…์ŠคํŠธ์˜ outer(=outerEnvironmentReference)์˜ ์Šค์ฝ”ํ”„ ์ฒด์ธ์—์„ ๋”ฐ๋ผ ์ „์—ญ ์ปจํ…์ŠคํŠธ์˜ LE๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
  • ์ „์—ญ ์ปจํ…์ŠคํŠธ LE record์— a ๊ฐ’ 1์ด ์กด์žฌํ•œ๋‹ค.
  • ์ฝ˜์†”์— 1์„ ์ถœ๋ ฅํ•œ๋‹ค.
  • outerํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  ์ฝœ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋œ๋‹ค.

5.์ „์—ญ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋‹ค์‹œ ํ™œ์„ฑํ™”๋œ๋‹ค.

  • ์ „์—ญ ์ปจํ…์ŠคํŠธ record์— a๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ˜์†”์— ํ•ด๋‹น ๊ฐ’์ธ 1์„ ์ถœ๋ ฅํ•œ๋‹ค. 

๋งŒ์•ฝ, inner ํ•จ์ˆ˜ ๋‚ด๋ถ€์— var a = 3;์ด ์—†๋‹ค๋ฉด

inner ์ปจํ…์ŠคํŠธ๋Š” ์Šค์ฝ”ํ”„ ์ฒด์ธ์„ ๋”ฐ๋ผ outer ์ปจํ…์ŠคํŠธ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ outer ์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€์—๋„ a์˜ ์ •๋ณด๊ฐ€ ์—†์–ด ์Šค์ฝ”ํ”„ ์ฒด์ธ์— ๋”ฐ๋ผ ์ „์—ญ ์ปจํ…์ŠคํŠธ์—์„œ a์˜ ๊ฐ’์„ ๋ฐ›์•„์˜จ๋‹ค.


2. this

this๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ๊ฒฐ์ •๋œ๋‹ค. ์ด๋•Œ this๊ฐ€ bind๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋  ๋•Œ๊ฐ€ ์•„๋‹ˆ๋ผ ์‹คํ–‰ ๋  ๋•Œ ์‹คํ–‰ ์ฃผ์ฒด์— ๋”ฐ๋ผ this๊ฐ€ ๋ฐ”๋€๋‹ค.

์•„๋ž˜์˜ ์˜ˆ์‹œ๋กœ this๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

 

var obj1 = {
    outer : function () {
        console.log(this); // obj1 { outer : function () {} }
        var innerFunc = function () {
            console.log(this); // node ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด, // obj2 { innerMethod : innerFunc }
        };

        innerFunc(); 

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

obj1.outer();

 

์ด๋ฅผ ์œ„ํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋จผ์ € ํ•จ์ˆ˜์™€ ๋ฉ”์„œ๋“œ์˜ ์ฐจ์ด๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.

ํ•จ์ˆ˜๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ๋‹จ์ง€ ํ•จ์ˆ˜๋ช…();์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์œผ๋กœ๋„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

ํ˜ธ์ถœ ์‹œ์ ์˜ ์‹คํ–‰ ์ฃผ์ฒด๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ this๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

 

ํ˜„์žฌ ์ฝ”๋“œ ์‹คํ–‰ ํ™˜๊ฒฝ์€ node์ด๋ฏ€๋กœ, node์˜ ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ๋œ๋‹ค.

(๋งŒ์•ฝ, ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์ฐฝ์— this๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค๋ฉด window ๊ฐ์ฒด๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๊ฒƒ์ด๋‹ค.)

 

๋ฐ˜๋ฉด ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด์˜ ํ˜ธ์ถœ์— ์˜ํ•ด ๋™์ž‘ํ•œ๋‹ค.

๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด ๊ฐ์ฒด.๋ฉ”์„œ๋“œ๋ช…();์˜ ํ˜•์‹์œผ๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค.

์ฆ‰ ์•ž์— ํ•ญ์ƒ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฐ์ฒด์ธ ์‹คํ–‰ ์ฃผ์ฒด๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋”ฐ๋ผ์„œ ๋งค์„œ๋“œ ๋‚ด๋ถ€์—์„œ this๋Š” ํ•ด๋‹น ๋งค์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์œ„์˜ ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•ด๋ณด์ž.

 

1.๋จผ์ € obj1์˜ ๋ฉ”์„œ๋“œ outer()๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

2.console์—์„œ this๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. 

  • ์ด ๋•Œ this๋Š” ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚จ ์ฃผ์ฒด ์ฆ‰, obj1์ด ๋œ๋‹ค.

3. innerFunc() ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  • innerFunc(); ํ˜ธ์ถœ ๋ฐฉ์‹๋งŒ ๋ด๋„ ์ผ๋ฐ˜ ํ•จ์ˆ˜์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ํ˜„์žฌ node.js์˜ ํ™˜๊ฒฝ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ์ฝ˜์†”์—๋Š” node.js ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

4. obj2.innerMethod(); ์ฆ‰ obj2์˜ innerMethod ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

  • innerMethod๊ฐ€ innerFunc๋ฅผ ์ฐธ์กฐํ•˜๋ฏ€๋กœ nnerFunc ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
  • ์—ฌ๊ธฐ์„œ this๋Š” ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ์ฃผ์ฒด, ์ฆ‰ obj2๊ฐ€ ๋œ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์ด๋ฒˆ์—๋Š” ์ฝ˜์†”์— obj2๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

์—ฌ๊ธฐ์„œ ์ž ๊น ! ๋ฉ”์„œ๋“œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ this๋ฅผ ์šฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์„๊นŒ?

๋„ค ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ํ™œ์šฉํ•˜๊ธฐ or ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

์šฐ์„  ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•ด๋ณด์ž.

const person = {
    name : 'Dana',
    sayHello : function () {
        const self = this;
        function innerFunc() {
            console.log(`hello ${self.name}`);
        }
        innerFunc();
    }
}

person.sayHello();

 

sayHelloํ•จ์ˆ˜ ๋‚ด๋ถ€ self๋ผ๋Š” ๋ณ€์ˆ˜์— this๋ฅผ ํ• ๋‹นํ•ด ์ฃผ์—ˆ๋‹ค.

์—ฌ๊ธฐ์„œ this๋Š” ์ด ๋ฉ”์„œ๋“œ์˜ ์‹คํ–‰ ์ฃผ์ฒด์ธ person๊ฐ์ฒด๊ฐ€ ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ innerFunc() ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋Š” self๋ฅผ ์ด์šฉํ•ด person๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์ฝ˜์†”์„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

๋งŒ์•ฝ self์— this๋ฅผ ํ• ๋‹นํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, innerFunc ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ this๋Š” node.js์˜ ์ „์—ญ ๊ฐ์ฒด๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์—

์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์ถœ๋ ฅ๊ฐ’์„ ์–ป์ง€ ๋ชปํ•  ๊ฒƒ์ด๋‹ค.

 

๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ this๋ฅผ ์šฐํšŒํ•˜๋Š” ๊ฒƒ์€ ํ•˜๋“œ์ฝ”๋”ฉ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๊ทผ์—๋Š” ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋‚˜, call, apply, bind๋ฅผ ๋” ์‚ฌ์šฉํ•˜๋‹ˆ ์ฐธ๊ณ ํ•˜์ž.

 

๋‹ค์Œ์œผ๋กœ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์ž.

const person = {
    name : 'Dana',
    sayHello : function () {
       const innerFunc = () => {
         console.log(`hello ${this.name}`);
       }   
        innerFunc();
    }
}

person.sayHello();

 

์œ„์™€ ๊ฐ™์€ ์˜ˆ์ œ๋ฅผ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ๋ฐ”๊ฟ”๋ณด์•˜๋‹ค.

sayHello() ๋‚ด๋ถ€ ํ•จ์ˆ˜์— innerFunc๋ฅผ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ–ˆ์„ ๋•Œ

๋†€๋ž๊ฒŒ๋„ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ๋งŒ๋“  innerFunc์˜ this๊ฐ€ person๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•œ์—ฌ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฐ’์„ ์ถœ๋ ฅํ•˜์˜€๋‹ค.

์ด๊ฒŒ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” this๋ฅผ bindingํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์ฆ‰ ์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š”

innerFunc๋‚ด๋ถ€์—์„œ this๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์Šค์ฝ”ํ”„์ฒด์ธ์„ ๋”ฐ๋ผ sayHello()๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.

sayHello์—์„œ this๋Š” person๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ธฐ ๋•Œ๋ฌธ์—, innerFunc์—์„œ this๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

2-1. ์ฝœ๋ฐฑํ•จ์ˆ˜์—์„œ์˜ this

์ฝœ๋ฐฑํ•จ์ˆ˜๋„ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this๋Š” ๋ชจ๋‘ ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

๋‹จ, ์ฝœ๋ฐฑํ•จ์ˆ˜์— ๋ณ„๋„๋กœ this๋ฅผ ์ง€์ •ํ•œ ๊ฒฝ์šฐ๋Š” ์˜ˆ์™ธ์ด๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด, addEventListener ๋ฉ”์„œ๋“œ๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ, ์ž์‹ ์˜ this๋ฅผ ์ƒ์†ํ•˜๋„๋ก ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋˜์–ด ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด๋•Œ this๋Š” addEventListener๋ฅผ ํ˜ธ์ถœ ์‹œํ‚ค๋Š” ์ฃผ์ฒด๊ฐ€ ๋œ๋‹ค. ( ex : button ํƒœ๊ทธ )

const array = [1,2,3,4,5];

array.forEach(function(item) {console.log(this)}); // node.js ์ „์—ญ ๊ฐ์ฒด๊ฐ€ 5๋ฒˆ ์ถœ๋ ฅ

 

 

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

const Person = function (name,age,isAdult) {
    this.name = name;
    this.age = age;
    this.isAdult = isAdult;
}

const person1 = new Person('Dana',30,true);
const person2 = new Person('Baby',5,false);

console.log('person1',person1); // Person { name: 'Dana', age: 30, isAdult: true }
console.log('person2',person2); // Person { name: 'Baby', age: 5, isAdult: false }

 

์—ฌ๊ธฐ์„œ ์–ด๋–ป๊ฒŒ this๋ฅผ ์‚ฌ์šฉํ•ด์„œ property๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„๊นŒ?

๊ทธ ์ด์œ ๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์— ์žˆ๋‹ค.

์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ๋นˆ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ์ด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฐ์ฒด์ด๋ฉฐ, this๋กœ ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ this๋Š” ๋ฐ”๋กœ ์ด ๋นˆ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค.

 

๊ฒฐ๊ณผ์ ์œผ๋กœ ๋นˆ๊ฐ์ฒด์— this๋ฅผ ํ™œ์šฉํ•ด ํ”„๋กœํผํ‹ฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.


3.  ๋ช…์‹œ์  this binding

์ž๋™์œผ๋กœ ๋ถ€์—ฌ๋˜๋Š” ์ƒํ™ฉ๋ณ„ this๊ฐ€ ์•„๋‹ˆ๋ผ ๋ณ„๋„์˜ ๊ฐ’์„ this์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธํ•œ๋‹ค.

3-1. call ๋งค์„œ๋“œ

ํ˜ธ์ถœ ์ฃผ์ฒด์ธ ํ•จ์ˆ˜๋ฅผ ์ฆ‰์‹œ ์‹คํ–‰ํ•œ๋‹ค.

์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์— this๋กœ bindingํ•  ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋ช…์‹์ ์œผ๋กœ binding์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

const food = {
    name : 'ํ”ผ์ž',
    sale : function (price) {
    	console.log(`${this.name}๋Š” ${price}์› ์ž…๋‹ˆ๋‹ค.`) // ํ–„๋ฒ„๊ฑฐ๋Š” 10000์› ์ž…๋‹ˆ๋‹ค.
    }
}

food.sale.call({ name : 'ํ–„๋ฒ„๊ฑฐ' },10000);

 

call ๋งค์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด, sale ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๋Š” food๊ฐ์ฒด๋ฅผ ์ฐธ๊ณ ํ•ด 'ํ”ผ์ž'๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” call ๋งค์„œ๋“œ๋ฅผ ์ด์šฉํ•ด ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์— this๋กœ bindingํ•  ๊ฐ์ฒด๋ฅผ  ๋„ฃ์–ด

sale ํ•จ์ˆ˜ ์‹คํ–‰ ์‹œ this.name์„ 'ํ–„๋ฒ„๊ฑฐ'๋กœ ์ถœ๋ ฅํ•˜๊ฒŒ ๋œ๋‹ค. 

 

3-2. apply ๋งค์„œ๋“œ

call๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ˜ธ์ถœ ์ฃผ์ฒด์ธ ํ•จ์ˆ˜๋ฅผ ์ฆ‰์‹œ ์‹คํ–‰ํ•˜๋ฉฐ, ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์— bindingํ•  ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

๋‹ค๋งŒ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ ๋ฐฐ์—ด์˜ ํ˜•ํƒœ๋กœ ๋„˜๊ฒจ์ค€๋‹ค.

const food = {
	name : 'pizza',
    	sale : function (price) {
    	console.log(`${this.name}๋Š” ${price}์› ์ž…๋‹ˆ๋‹ค.`)
    }
}

food.sale.apply({ name : 'hamburger'},[10000]);

 

3-3. bind ๋งค์„œ๋“œ

call๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ, ์ฆ‰์‹œ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ๋„˜๊ฒจ๋ฐ›์€ this์™€ ์ธ์ˆ˜๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

bind๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ํ•จ์ˆ˜์— this๋ฅผ ๋ฏธ๋ฆฌ ์ ์šฉํ•œ๋‹ค.
  • ํ•จ์ˆ˜๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ ๋ฏธ๋ฆฌ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
function getAverage (x,y) {
  const average = (x + y) / this.theNumberOfStudents;
  return average;
}

const getAverageByBind = getAverage.bind({theNumberOfStudents : 10})

const averageByCall = getAverage.call({ theNumberOfStudents : 10}, 20,30);
const averageByBind = getAverageByBind(20,30);

console.log(averageByCall); // 5
console.log(averageByBind); // 5


const getAverageByOneScore = getAverageByBind.bind(null,30);
const averageByOneScore = getAverageByOneScore(60);
console.log(averageByOneScore); // 9

 

์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” getAverage ํ•จ์ˆ˜ ๋‚ด๋ถ€์— this๋กœ ๊ฐ’์„ ๊ฐ€์ ธ์™€ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜์˜€๋‹ค.

 

์šฐ์„  getAverageByBind๋Š” bind๋ฅผ ํ†ตํ•ด this๋ฅผ ๋ฏธ๋ฆฌ ์ ์šฉํ–ˆ๋‹ค.

๋”ฐ๋ผ์„œ getAverageByBind(20,30); ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ,

call ๋งค์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์™€๋Š” ๋‹ฌ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ this๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

call๋งค์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ์€ ๋ณ€์ˆ˜ averageByCall์— ํ• ๋‹น๋œ ๊ฐ’์„ ๋ณด๋ฉด ๋˜๋Š”๋ฐ, ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ this ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์žˆ๋‹ค.

 

๋‹ค์Œ์œผ๋กœ ๋ณ€์ˆ˜ averageByOneScore์˜ ๊ฐ’์„๋ณด๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ 60๋งŒ ์ „๋‹ฌํ•˜๊ณ  ์žˆ๋‹ค.

์ด๋Š” getAaverageByBindํ•จ์ˆ˜์— bind ๋งค์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฏธ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜ 30์„ ์ „๋‹ฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ฝ˜์†” ์ถœ๋ ฅ ๊ฐ’ ์—ญ์‹œ ์šฐ๋ฆฌ๊ฐ€ ๊ธฐ๋Œ€ํ•œ ๋Œ€๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 


์˜ค๋Š˜์˜ ํšŒ๊ณ 

๊ทธ๋™์•ˆ ์ฝ”๋“œ๋ฅผ ์น˜๊ธฐ๋งŒ ํ–ˆ์ง€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ •ํ™•ํ•œ ๋™์ž‘ ์›๋ฆฌ๋Š” ์ž˜ ์•Œ์ง€ ๋ชปํ–ˆ๋‹ค.

์ด๋ฒˆ 3์ฃผ์ฐจ ๊ฐ•์˜๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ๋งŽ์€ ๊ฒƒ์„ ๋ฐฐ์›Œ๊ฐ€๋Š” ๊ฑฐ ๊ฐ™์•„ ๋ฟŒ๋“ฏํ•˜๋‹ค.

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์ด์ œ ์–ด๋А์ •๋„ ๊ฐ์„ ์žก์•˜๋Š”๋ฐ

call, apply, bind ๋ชจ๋‘ ์•„์ง ๋‚ฏ์„ค์–ด์„œ ๊ฐ์ด ์ž˜ ์•ˆ ์žกํžŒ๋‹ค.

 

๋ฐ˜๋ณตํ•˜๋‹ค ๋ณด๋ฉด ๋ˆˆ์—๋„ ์ต๊ณ  ์†์—๋„ ์ต๊ฒ ์ง€^_ ใ… 

ํŒŒ์ดํŒ…์ด๋‹ค ํŒŒ์ดํŒ…..