๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป DEV/Javascript & NodeJS

[Javascript] Javascript ์˜ this ๋ž€?

by vodkassi 2021. 9. 7.
728x90

 

 

โ— ์ฃผ์˜: Node ์—์„œ์˜ this ๋Š” ์กฐ๊ธˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ ๋‹ค๋ฃจ๋Š” ๋‚ด์šฉ์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•˜๋Š” JS ์—์„œ์˜ this ์ž…๋‹ˆ๋‹ค. 

 

Javascript ์˜ this ๋Š” ์ž์ฃผ ๋“ฑ์žฅํ•˜์ง€๋งŒ, ์ •ํ™•ํžˆ ์•Œ๊ธฐ ํž˜๋“  ๊ฐœ๋…์ด๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” this ์˜ ๊ธฐ์ดˆ ์ž‘๋™ ๋ฐฉ์‹๊ณผ ๋ฐ”์ธ๋”ฉ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ณ ์ž ํ•œ๋‹ค. this ์˜ ๊ฐœ๋…์— ์ ‘๊ทผํ•˜๊ธฐ ์ „, ๋จผ์ € ์•Œ์•„๋‘์–ด์•ผ ํ•˜๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์™€ ํ”„๋กœํผํ‹ฐ & ๋ฉ”์„œ๋“œ๋ถ€ํ„ฐ ์‚ดํŽด๋ณด์ž.

 

โœจ  Javascript ์—์„œ์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ

์ด์ „ ๊ธ€์—์„œ ์ž ๊น ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ, Javascript ๋Š” ์ปดํŒŒ์ผ ์–ธ์–ด๊ฐ€ ์•„๋‹Œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด์ด๋‹ค.

์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋Š” ์‹คํ–‰ ์ฆ‰์‹œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์ฝ”๋“œ๋ฅผ ํ•œ์ค„์”ฉ ์ฝ์–ด๋‚ด๋ ค๊ฐ€๋ฉฐ ์‹คํ–‰ํ•œ๋‹ค. 

์ด ๋•Œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋Š” ์ฝ”๋“œ ํ•ด์„์„ ์กฐ๊ธˆ์ด๋ผ๋„ ํŽธํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์ž‘์€ ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆ„๋Š”๋ฐ, ์ด ๋•Œ ๋‚˜๋‰œ ์กฐ๊ฐ๋“ค์ด "์‹คํ–‰ ์ปจํ…์ŠคํŠธ" (Execution Context) ์ด๋‹ค. 

 

๐Ÿ“Œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ๊ทธ๋ž˜์„œ ๋ฌด์—‡์ธ๊ฐ€? 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ scope, hoisting, closure ๋“ฑ์„ ๋‹ด๊ณ  ์žˆ๋Š” ํ•ต์‹ฌ ์›๋ฆฌ์ด๋ฉฐ,

"์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ํ™˜๊ฒฝ" ์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โœจ  ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ช…๋ นํ˜•, ํ•จ์ˆ˜ํ˜•, ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜, ๊ฐœ์ฒด๋น„ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (OOP) ์„ ์ง€์›ํ•˜๋Š” ๋ฉ€ํ‹ฐ ํŒจ๋Ÿฌ๋‹ค์ž„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ด๋‹ค. ์ค‘์š”ํ•œ ๊ฒƒ์€, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ด๋ฉฐ, ์›์‹œ ํƒ€์ž…์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๊ฐ’๋“ค์€ ๋ชจ๋‘ ๊ฐ์ฒด์ด๋‹ค. 

 

์›์‹œ ํƒ€์ž…์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๊ฐ’

- ํ•จ์ˆ˜

- ๋ฐฐ์—ด

- ์ •๊ทœ ํ‘œํ˜„์‹ 

- Etc... 

 

๊ฐ์ฒด๋Š” ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ”„๋กœํผํ‹ฐ์™€ ๋™์ž‘์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฉ”์„œ๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. 

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ์ ์ธ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž. 

 

const student = {
    age: 10,
    addTen: () => {
    	return student.age + 10;
    }
};

student.addTen() // 20

 

๐Ÿ“Œ ์—ฌ๊ธฐ์„œ student ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋Š” ๋ฌด์—‡์ธ๊ฐ€?

ํ”„๋กœํผํ‹ฐ๋Š” ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ์ดํ„ฐ์ด๋‹ˆ, age ์ด๋‹ค. 

 

๐Ÿ“Œ ๊ทธ๋ ‡๋‹ค๋ฉด student ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋Š” ๋ฌด์—‡์ธ๊ฐ€?

๋ฉ”์„œ๋“œ๋Š” ํ”„๋กœํผํ‹ฐ์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์กฐ์ž‘ํ•˜๋Š” ๋™์ž‘์ด๋‹ˆ, addTen() ์ด๋‹ค. 

 

์ด๋ ‡๋“ฏ ๋ฉ”์„œ๋“œ๊ฐ€ ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ณ , ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹๋ณ„์ž (์šฐ์„ ์€ ๋ณ€์ˆ˜๋ช…์ด๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ์‰ฝ๋‹ค) ๋ฅผ ์ฐธ์กฐํ•ด์•ผ ํ•œ๋‹ค. 

 

๊ทธ๋ ‡๋‹ค๋ฉด ๋ชจ๋“  ๊ฒฝ์šฐ์— ์ด๋ ‡๊ฒŒ ๋ฉ”์„œ๋“œ๊ฐ€ ์ž์‹ ์ด ์ฐธ์กฐํ•ด์•ผ ํ•˜๋Š” ์‹๋ณ„์ž๋ฅผ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ?

๋‹ต์€ "No" ์ด๋‹ค. ์—ฌ๊ธฐ์„œ, this ์˜ ํ•„์š”์„ฑ์ด ๋“œ๋Ÿฌ๋‚˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค. 

 

 

โœจ  this ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

๐Ÿ“Œ ์œ„์˜ ์˜ˆ์‹œ๊ฐ€ ์ธํ„ฐํ”„๋ฆฌํ„ฐ์—์„œ ํ•ด์„๋˜๋Š” ๋‹จ๊ณ„๋ฅผ ์šฐ์„  ์•Œ์•„๋ณด์ž.

1. ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ฝ์–ด ๋‚ด๋ ค๊ฐ€๋Š” ์ˆœ๊ฐ„, ๊ฐ์ฒด๊ฐ€ ๋จผ์ € ํ‰๊ฐ€๋œ๋‹ค.

2. ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์˜ ํ‰๊ฐ€๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์–ด, student ์— ํ• ๋‹น๋œ๋‹ค. 

3. ๊ทธ ์ดํ›„์— student.addTen() ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฏ€๋กœ, ์ด๋ฏธ ์ƒ์„ฑ๋œ student.age ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. 

 

๊ทธ๋ ‡๋‹ค๋ฉด this ๋Š” ์™œ ํ•„์š”ํ• ๊นŒ? ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ํ”„๋กœํผํ‹ฐ ์ƒ์„ฑ์ด ๋จผ์ € ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ฐ€๋ น, ์ƒ์„ฑ์ž ํ•จ์ˆ˜ (Constructor Function) ์€ ์ผ๋ฐ˜ ๊ฐ์ฒด์™€๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ํ‰๊ฐ€๋œ๋‹ค. 

 

์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ : 

- ์œ ์‚ฌํ•œ ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค์ด๋ฉฐ,

- new ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ๋น„๋กœ์†Œ ์ธ์Šคํ„ด์Šค๊ฐ€ '์ƒ์„ฑ'์ด ๋œ๋‹ค. 

(์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ๋” ์•Œ์•„๋ณด๋ ค๋ฉด ํ•ด๋‹น ๋งํฌ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ๋œ๋‹ค)

 

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ์‹œ์ ์—์„œ๋Š”, ์•„์ง new ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค ์‹๋ณ„์ž์— ํ• ๋‹นํ•˜๊ธฐ ์ „์ด๋ฏ€๋กœ, ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด์˜ ๊ฐ’์ด ์ฐธ์กฐํ•  ์‹๋ณ„์ž๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค. 

 

function User(name) {
  ?.name = name;
  ?.isAdmin = false;
}

 

User ๋ผ๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด name ๊ณผ isAdmin ์ด๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์ •ํ•˜๊ณ ์ž ํ•˜๋Š”๋ฐ, ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๋Š” User ์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์•„๋‹ˆ๋ผ ํ–ฅํ›„ ์ƒ์„ฑ๋  ์ธ์Šคํ„ด์Šค์˜ ํ”„๋กœํผํ‹ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— User.name ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜๋Š” ์—†๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ์œ„ํ•ด, ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด ๋˜๋Š” ์ž์‹ ์ด ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” (๊ทธ๋ฆฌ๊ณ  ๊ฐ’์„ ์ฐธ์กฐํ•˜๋Š”) ์‹๋ณ„์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  ์ด ํŠน์ˆ˜ํ•œ Javascript ์‹๋ณ„์ž๊ฐ€ ๋ฐ”๋กœ this ์ด๋ฉฐ, ์•ž์„œ ์–ธ๊ธ‰ํ•œ ์—ญํ•  ๋•Œ๋ฌธ์— this ๋ฅผ ์ž๊ธฐ ์ฐธ์กฐ (self-referencing) ๋ณ€์ˆ˜๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. 

 

function User(name) {
  this.name = name;
  this.isAdmin = false;
}

let vodka = new User(haeun);
console.log(vodka.name) // haeun

let beer = new User(kang);
console.log(beer.name) // kang

 

๐Ÿ“Œ ์œ„์˜ ์ฝ”๋“œ๊ฐ€ ํ•ด์„๋˜๋Š” ๋‹จ๊ณ„๋ฅผ ์‚ดํŽด๋ณด๋ฉด,

1. User ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ๋จผ์ € ์ •์˜๋œ๋‹ค. (this ๋ฅผ ํ†ตํ•ด ํ–ฅํ›„ ์ถ”๊ฐ€๋  ์ธ์Šคํ„ด์Šค ์ฐธ์กฐ)

2. new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ, vodka ์‹๋ณ„์ž์— ํ• ๋‹น๋œ๋‹ค.

3. vodka ์—๋Š” name, isAdmin ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋‹ด๊ธด ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋˜์—ˆ๋‹ค. 

4. beer ์— ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋˜๋Š” ๊ณผ์ •๋„ 1~3๊ณผ ์œ ์‚ฌํ•˜๋‹ค. 

 

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

 

 

โœจ  This ์˜ ์ฃผ์š” ํŠน์ง•

๐Ÿ“Œthis ๋Š” ๋…ํŠนํ•œ ํŠน์ง• ๋ช‡ ๊ฐ€์ง€๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์— ์˜ํ•ด ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

2. ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ arguments ๊ฐ€ ์•”๋ฌต์ ์œผ๋กœ ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์ „๋‹ฌ๋˜๋“ฏ, this ๋„ ์•”๋ฌต์ ์œผ๋กœ ์ „๋‹ฌ๋œ๋‹ค. (์ง€์—ญ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)

3. ์ฝ”๋“œ ์–ด๋””์„œ๋“  ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค. 

4. this ๋ฐ”์ธ๋”ฉ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹ & ์‹œ์ ์— ์˜ํ•ด ๊ฒฐ์ •๋œ๋‹ค. 

 

1 & 2 ๋ฒˆ ํŠน์ง•์€ ๊ทธ ์ž์ฒด๋กœ ์„ค๋ช…์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€์—ฐ์„ ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋‚˜, 

3 & 4 ๋ฒˆ ํŠน์ง•์€ ํ˜ผ๋ž€์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์–ด ์กฐ๊ธˆ ๋” ๊นŠ์ด ๋“ค์–ด๊ฐ€๋ณด๊ณ ์ž ํ•œ๋‹ค. 

 

๐Ÿ“Œ this ๋ฐ”์ธ๋”ฉ & this ์˜ ์ฐธ์กฐ๊ฐ’

 

๋ฐ”์ธ๋”ฉ์ด๋ž€ ์‹๋ณ„์ž์™€ ๊ฐ’์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋  ๋–„, ๋ณ€์ˆ˜ ์ด๋ฆ„(์‹๋ณ„์ž)์™€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ์—ฐ๊ฒฐ๋˜๋Š”๋ฐ, ์ด ๊ณผ์ • ์—ญ์‹œ ๋ฐ”์ธ๋”ฉ์ด๋‹ค.

this ๋ฐ”์ธ๋”ฉ์€ this ์‹๋ณ„์ž์™€ this ๊ฐ€ ๊ฐ€๋ฆฌํ‚ฌ ๊ฐ’์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ณผ์ •์ด๋ฉฐ, ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ strict mode ์—๋„ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค. 

 

 this ๋ฐ”์ธ๋”ฉ์ด ๋‹ค๋ฅด๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š” ๋ช‡ ๊ฐ€์ง€ ์ƒํ™ฉ์„ ์‚ดํŽด๋ณด์ž.

 

1. ์ „์—ญ scope ์—์„œ์˜ this ๋Š” window ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. window ๋Š” ์ „์—ญ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

console.log(this) // window

 

2. ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, this ๋Š” window ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. 

2-1. strict mode ๊ฐ€ ์ ์šฉ๋œ ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this ์—์„œ๋Š” undefined ๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค. (๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜์—์„œ this ์˜ ์—ญํ• ์€ ๋ฌด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค) 

2-2. ์–ด๋–ค ํ•จ์ˆ˜๋ผ๋„ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋˜๋ฉด this ์— ์ „์—ญ ๊ฐ์ฒด๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค. (์ค‘์ฒฉ, ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํฌํ•จ)

 

function hello() {
    console.log(this)
}

hello() // window

 

 

 

3. ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ ๋‚ด์˜ this ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด ์ž์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. 

3-1. ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์ •์˜ํ•œ ์ค‘์ฒฉ ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ์ผ์ง€๋ผ๋„, ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋œ๋‹ค๋ฉด ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. 

 

const hello = {
    name: 'Haeun',
    getName() {
    	console.log(this)
    }
}

hello.getName() // {name: 'Haeun, getName: f}
const hello = {
    name: 'Haeun',
    getName() {
    	console.log(this); // {name: 'Haeun, getName: f}
        function world () {
        	console.log(this) // window
        }
    }
}

 

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

 

function Hello (name) {
    this.name = name;
    console.log(this) // Hello {name: 'kang'}
}

const me = new Hello ('Kang')

 

 

๐Ÿ“Œ (์•ฝ๊ฐ„์˜ ์‹ฌํ™”) ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹๊ณผ this ํ˜ธ์ถœ ์‹œ์ ์— ๋”ฐ๋ฅธ this ๋ฐ”์ธ๋”ฉ 

 

๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์˜ this ๋Š” (๊ทธ๋ฆฌ๊ณ  ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this ๋Š”) ๋ฉ”์„œ๋“œ๋ฅผ ์†Œ์œ ํ•œ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค. 

๋˜ํ•œ, this ์— ๋ฐ”์ธ๋”ฉ๋  ๊ฐ์ฒด๋Š” ํ˜ธ์ถœ ์‹œ์ ์— ๊ฒฐ์ •๋œ๋‹ค. 

 

ํ•˜๋‚˜์˜ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž.

 

const person = {
    name: 'Kang',
    getName() {
    	console.log(this.name);
    }
};

person.getName(); // Kang

 

์ผ๋ฐ˜์ ์ธ ๊ฐ์ฒด ๋ฉ”์„œ๋“œ์™€ this binding ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋ณต์‚ฌํ•˜์—ฌ ์‹คํ–‰ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? 

๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ์‹คํ–‰ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? 

 

const person = {
    name: 'Kang',
    getName() {
    	console.log(this.name);
    }
};

person.getName(); // Kang 

const anotherPerson = {
    name: 'Kim',
};

anotherPerson.getName = person.getName;
const getName = person.getName;

anotherPerson.getName(); // Kim
getName(); // ''

 

anotherPerson ์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด์— getName ์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์˜ฎ๊ฒจ์„œ ์‹คํ–‰ํ–ˆ์„ ๋•Œ, this ๋Š” person ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ anotherPerson ์ด ๋˜์—ˆ๋‹ค. ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ์ ์— this ๊ฐ€ ๊ฒฐ์ •๋œ ์‚ฌ๋ก€์ด๋‹ค. 

 

๋˜ํ•œ, getName ์„ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ์˜ฎ๊ฒจ์„œ ์‹คํ–‰ํ–ˆ์„ ๋•Œ์˜ this ๋Š” ์ „์—ญ ๊ฐ์ฒด์ธ 'window' ๊ฐ€ ๋œ๋‹ค. ํ˜„์žฌ window ์— name ์ด๋ผ๋Š” ๊ฐ’์€ ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋–„๋ฌธ์—, ์–ด๋– ํ•œ ๊ฐ’๋„ ์ถœ๋ ฅํ•˜์ง€ ์•Š๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

 

โœจ  ์ผ๋ฐ˜ ํ•จ์ˆ˜์˜ this ๋ฐ”์ธ๋”ฉ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•

์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ, ๋ฌด์—‡์ด๋“  ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ this ์—๋Š” ์ „์—ญ ๊ฐ์ฒด๊ฐ€ ๋ฐ”์ธ๋”ฉ๋˜์–ด, ์›ํ•˜๋Š” ๊ฐ’์„ ์–ป์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ๋‹ค. 

์ด๋ฅผ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ํ•ด๊ฒฐ์ฑ… ์—ญ์‹œ ์กด์žฌํ•œ๋‹ค. 

 

 

1. ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์— ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜์—ฌ this ํ• ๋‹น 

 

// Original Case

var name = 'Global'

const hello = {
    name: 'Local',
    getName() {
        function world () {
        	console.log(this.name) // Global
        }
    }
}

// ์ค‘์ฒฉ ํ•จ์ˆ˜ ๋‚ด ์ƒˆ๋กญ๊ฒŒ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ Case 

var name = 'Global'

const hello = {
    name: 'Local',
    getName() {
        const that = this
        function world () {
        	console.log(that.name) // Local
        }
    }
}

 

2. this ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ๋Š” Javascript method ํ™œ์šฉ 

- Function.apply

- Function.call

- Function.bind

apply, call, bind ์˜ ์ž์„ธํ•œ ์ธ์ˆ˜๋Š” MDN ๋ฌธ์„œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์•„๋ž˜๋Š” ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ apply ์™€ call ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ this ๋ฐ”์ธ๋”ฉํ•œ ์‚ฌ๋ก€์ด๋‹ค. 

apply ์™€ call ์€ ์ „๋‹ฌํ•˜๋Š” ์ธ์ˆ˜์˜ ๋ฐฉ์‹๋งŒ ๋‹ค๋ฅผ ๋ฟ, ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ํŠน์ • ๊ฐ์ฒด๋ฅผ ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜์˜ this ์— ๋ฐ”์ธ๋”ฉํ•œ๋‹ค. 

 

// Original Case

function bindingFunc() {
	console.log(this) // window
}

// apply, call

const temp = {a:1}

bindingFunc.apply(temp) // {a:1}
bindingFunc.call(temp) // {a:1}

 

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

 

// Original Case

function bindingFunc() {
	console.log(this) // window
}

// bind

const temp = {a:1}

bindingFunc.bind(temp) // ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Œ 
bindingFunc.bind(temp)() // temp ๊ฐ€ ๋ฐ”์ธ๋”ฉ ๋˜์–ด ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋จ, {a:1}

 

โœจ ์ •๋ฆฌ

์ด๋ฒˆ ๊ธ€์—์„œ ๋‹ค๋ฃฌ ๋‚ด์šฉ์ด ์ •๋ง ๋งŽ์€๋ฐ, ๋ช‡ ๊ฐ€์ง€๋งŒ ๊ธฐ์–ตํ•˜๋ฉด this ๋ฅผ ํ›จ์”ฌ ์ž˜ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. 

 

๐Ÿ“Œ this ๋Š” ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด ๋˜๋Š” ์ž์‹ ์ด ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” (๊ทธ๋ฆฌ๊ณ  ๊ฐ’์„ ์ฐธ์กฐํ•˜๋Š”) ์‹๋ณ„์ž์ด๋‹ค. 

๐Ÿ“Œ this ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์— ์˜ํ•ด ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

๐Ÿ“Œ this ๋ฐ”์ธ๋”ฉ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹ & ์‹œ์ ์— ์˜ํ•ด ๊ฒฐ์ •๋œ๋‹ค. 

๐Ÿ“Œ ์–ด๋– ํ•œ ํ•จ์ˆ˜๋“  ์ผ๋ฐ˜ ํ•จ์ˆ˜์˜ ํ˜•ํƒœ๋กœ ํ˜ธ์ถœ ์‹œ this ๋Š” ์ „์—ญ ๊ฐ์ฒด์ธ window ์ด๋‹ค. 

๐Ÿ“Œ ์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ Javascript ๋‚ด์žฅ ํ•จ์ˆ˜ ๋ฉ”์„œ๋“œ๋“ค์ด ์กด์žฌํ•œ๋‹ค. 

 

 

โœจ ๋ฐฐ์šด ์ 

  • this... ์ •๋ง ๋งŒ๋งŒํ•˜๊ฒŒ ๋ดค๋‹ค๊ฐ€ ํฐ ์ฝ” ๋‹ค์น  ๋ป”ํ–ˆ๋‹ค. ์ƒ๊ฐ๋ณด๋‹ค scope ๋‚˜ context ์— ์˜ํ–ฅ์„ ๋งŽ์ด ๋ฐ›๋Š” ์‹๋ณ„์ž๋ผ๋Š” ์‚ฌ์‹ค์„ ๊นจ๋‹ฌ์•˜๊ณ , ๋งŽ์€ ์—ฐ์Šต์„ ํ†ตํ•ด this ๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ„ฐ๋“ํ•ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.
  • Javascript ์˜ ์ฝ”๋“œ๋ฅผ ์ฝ์–ด๋‚ด๋ฆฌ๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ์˜ ์ž‘๋™ ๊ณผ์ •์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ์ดํ•ด๊ฐ€ ์—†์ด๋Š” "Javascript ๋ฅผ ์“ธ ์ค„ ์•ˆ๋‹ค" ๊ณ  ํ‘œํ˜„ํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ •์ด ๊ณง Javscript ์˜ ๊ทผ๋ณธ์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค. 

 

 

โœจ  ์ฐธ๊ณ ์ž๋ฃŒ

๋Œ“๊ธ€