๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ– WELL-DONE Project/Javascript

this ๊ฐœ๋… ์ดํ•ดํ•˜๊ธฐ

this

๋‚ด๊ฐ€ ๊ตญ๋ฏผํ•™๊ต 2,3ํ•™๋…„๋•Œ (1992๋…„์ •๋„?) 3-4๋ช…์ด ๊ทธ๋ฃน์„ ์ง€์–ด 1์กฐ๋ฅผ ์ด๋ค„ ๋งค ์ฃผ ๊ฐ ์ง‘์œผ๋กœ ๋กœํ…Œ์ด์…˜ํ•˜๋ฉด์„œ ์˜์–ด์„ ์ƒ๋‹˜์„ ๋ชจ์‹œ๊ณ  ํ•™์Šตํ•˜๋Š”๊ฒŒ ์œ ํ–‰์ด์—ˆ๋‹ค. ๊ทธ๋•Œ ํ•ต์‹ฌ ์ž๋ฃŒ๋Š” ์˜์–ด ๋น„๋””์˜ค์˜€๋‹ค. (์ง€๊ธˆ์€ ์ฐพ์•„๋ณด๊ธฐ๋„ ํž˜๋“  ๋น„๋””์˜ค ํ…Œ์ดํ”„์ด์ง€๋งŒ..) ๋‹ค๋ฅธ ๊ฑด ๊ธฐ์–ต์ด ํ•˜๋‚˜๋„ ๋‚˜์ง€ ์•Š์ง€๋งŒ, ์š”์ƒํ•œ ๋™๋ฌผ์ด ๋‚˜์™€ ์š”์ƒํ•œ ์˜์–ด ๋…ธ๋ž˜๋ฅผ ๋ถ€๋ฅด๋˜ ์žฅ๋ฉด์€ ์–ด๋ ดํ’‹์ด ๊ธฐ์–ต์ด ๋‚œ๋‹ค.(์ด ๋™๋ฌผ์€ ๊ณผ์—ฐ ๋ฌด์—‡์ด์—ˆ์„๊นŒ?)
video

"This is a banana" , "This is an apple" ๋…ธ๋ž˜์™€ ํ•จ๊ป˜ ์—ฌ๋Ÿฌ ๊ณผ์ผ๋“ค์„ ์˜์–ด๋กœ ์†Œ๊ฐœํ•ด์คฌ๋‹ค. ์ด ๋•Œ ๋ฐฐ์› ๋˜ ๋ฉœ๋กœ๋””์™€ "This is ..." ๋ฌธ์žฅ์€ ๋‚ด ๋จธ๋ฆฟ์†์— ๊นŠ์ˆ™ํžˆ ์ƒˆ๊ฒจ์ ธ ์žˆ๋‹ค.ํ•œ๊ธ€๋กœ ํ•ด์„ํ•˜๋ฉด ๋‹จ์ˆœํžˆ '์ด๊ฒƒ'์ด๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์˜์–ด์—์„œ๋Š” ์ข€ ๋” ํฌ๊ด„์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๊ฑฐ ๊ฐ™๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ this๋ž€ ๋‹จ์–ด๋Š” ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”๊ฑธ๊นŒ? ์•„๋‹ˆ ๋” ์ž‘๊ฒŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ > ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ this๋ž€ ์–ด๋–ค ์—ญํ• ์„ ์•Œ์•„๋ณด์ž.

techsith ์œ ํŠœ๋ธŒ - Javascript this keyword explained | in Gloable Scope, Object, Function, Prototype, Method, Class ์ดˆ๋ฐ˜์— this์— ๋Œ€ํ•œ ์žฌ๋ฏธ๋‚œ ์„ค๋ช…์ด ์žˆ์—ˆ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด JJuice์˜ ์ง‘์€ ์ œ์ฃผ๋„ ์ œ์ฃผ์‹œ ์ œ์ฃผ๋™์— ์œ„์น˜ํ•˜๊ณ  35๋…„์ „์— ์ง€์–ด์กŒ๋‹ค. ์˜ค๋ž˜๋œ ์ง‘์ธ๋งŒํผ ์ˆ˜๋„๊ด€์—์„œ ๋ฌผ์ด ์ƒˆ๊ณ  ๋ณด์ผ๋Ÿฌ๋„ ๊ณ ์žฅ๋‚˜ ์ˆ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์ˆ˜๋ฆฌ์—…์ฒด์— ์ „ํ™”ํ•ด์„œ JJuice์˜ ์ง‘์— ๋Œ€ํ•ด ์ •์˜๋ฅผ ํ•œ ํ›„ (์ฃผ์†Œ ๋ฐ ๊ธฐํƒ€ ์‚ฌํ•ญ๋“ฑ) '์ด ์ง‘์˜ ์ˆ˜๋„๊ด€์€ ๊ณ ์žฅ๋‚ฌ์–ด์š”..' ๋ผ๊ณ  ๋งํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ '์ด ์ง‘'์ด๋ผ๊ณ  ํ•˜๋Š” ๊ฑด ๋ฐ”๋กœ 'this'๋ผ๊ณ  ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋งค ๋ฒˆ '์ œ์ฃผ๋„ ์ œ์ฃผ์‹œ ์ œ์ฃผ๋™์— ์œ„์น˜ํ•œ 35๋…„๋œ JJuice๊ฐ€ ์ฃผ์ธ์ธ ์ง‘์€ ์ˆ˜๋„๊ด€์ด ๊ณ ์žฅ๋‚ฌ๊ณ ์š”,' / '์ œ์ฃผ๋„ ์ œ์ฃผ์‹œ ์ œ์ฃผ๋™์— ์œ„์น˜ํ•œ 35๋…„๋œ JJuice๊ฐ€ ์ฃผ์ธ์ธ ์ง‘์€ ๋ณด์ผ๋Ÿฌ๊ฐ€ ๊ณ ์žฅ๋‚ฌ์–ด์š”.' ๋ผ๊ณ  ๋งํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด ์ง‘, ์ฆ‰ 'this' ๋‹จ์–ด ํ•˜๋‚˜๋กœ ์ค„์—ฌ์„œ ๋งํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋„ this๋„ ์œ„์™€๊ฐ™์€ ์—ญํ• ์„ ํ•˜๋Š”๊ฒŒ ์•„๋‹๊นŒ? ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ์ฒด๋กœ ์ด๋ฃจ์–ด์ง„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์ธ๋งŒํผ '์ œ์ฃผ๋„ ์ œ์ฃผ์‹œ ์ œ์ฃผ๋™์— ์œ„์น˜ํ•œ 35๋…„๋œJJuice' ์˜ ๊ฐ์ฒด์— '๊ณ ์žฅ๋‚œ ๋ณด์ผ๋Ÿฌ'๋ž€ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ด ๊ฐ์ฒด์˜ ์ •๋ณด๋ฅผ ์ˆ˜๋ฆฌ์—…์ฒด ๋ณ€์ˆ˜์— ์•Œ๋ ค์ค„๋•Œ this๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด this.๊ณ ์žฅ๋‚œ ๋ณด์ผ๋Ÿฌ=true ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•ด ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ this๋Š” ์ฐธ์œผ๋กœ ๋งค๋ ฅ?!์ ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. (์†”์งํ•˜๊ฒŒ ๋‚˜์—๊ฒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜this ๋งค๋ ฅ์ ์ด๋ผ๊ธฐ๋„ ๋ณด๋‹ค ๋ฌด์Ÿˆ๊ฒŒ ํ—ท๊ฐˆ๋ฆฐ๋‹ค.) ์ด this๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ์œ ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๊ธฐ๋„ ํ•˜๊ณ  ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•?!์„ ์ด์šฉํ•ด this์— ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฐ์ฒด๋„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ์ข€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ๋กœ ํ•˜์ž.

์ƒํ™ฉ๋ณ„ this๊ฐ€ ๊ฐ€๋ฅดํ‚ค๋Š” ๊ฒƒ์€? (๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ)

โ–  Global ์˜์—ญ์—์„œ์˜ this

์ž ๊ตฌ๊ธ€ ํฌ๋กฌ์ฐฝ > ๊ฐœ๋ฐœ์ž ๋„๊ตฌ > ์ฝ˜์†” ๋ž€์— ๋“ค์–ด๊ฐ€์„œ ์ณ๋ณด์ž.

console.log('this๋Š” ๋ˆ„๊ตฌ์ผ๊นŒ์š”?:' + this);

๋ฐ”๋กœ [object Window]๋ผ๊ณ  ๋‚˜์˜จ๋‹ค.
๊ทธ ์ด์œ ๋Š” ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ๋Š” ์ตœ์ƒ์œ„ ๊ฐ์ฒด๊ฐ€ window์ด๊ณ  window๊ฐ์ฒด์•ˆ์— 'console'์ด๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

nodeํ™˜๊ฒฝ์—์„œ๋Š” ์ตœ์ƒ์œ„ ๊ฐ์ฒด๊ฐ€ global object์ด๋‹ค.

<๐Ÿ˜ฎJJuice ์‹คํ—˜์‹ค>
โ‘  this์— ๋“ฑ๋กํ•˜๊ธฐ / window์— ๋“ฑ๋กํ•˜๊ธฐ / ๋ณ€์ˆ˜๋กœ ๋“ฑ๋กํ•˜๊ธฐ

this.house = '์ œ์ฃผ๋„ ์ œ์ฃผ๋™ ์ œ์ฃผ์‹œ 35๋…„๋œ JJuice์ง‘';
window.home = '์ œ์ฃผ๋„ ์ œ์ฃผ๋™ ์ œ์ฃผ์‹œ 35๋…„๋œ JJuice์ง‘';
const jjuiceHouse = '์ œ์ฃผ๋„ ์ œ์ฃผ๋™ ์ œ์ฃผ์‹œ 35๋…„๋œ JJuice์ง‘';

console.log(house); //'์ œ์ฃผ๋„ ์ œ์ฃผ๋™ ์ œ์ฃผ์‹œ 35๋…„๋œ JJuice์ง‘'
console.log(home); //'์ œ์ฃผ๋„ ์ œ์ฃผ๋™ ์ œ์ฃผ์‹œ 35๋…„๋œ JJuice์ง‘'
console.log(jjuiceHouse); //'์ œ์ฃผ๋„ ์ œ์ฃผ๋™ ์ œ์ฃผ์‹œ 35๋…„๋œ JJuice์ง‘'

console.log(this.house); //'์ œ์ฃผ๋„ ์ œ์ฃผ๋™ ์ œ์ฃผ์‹œ 35๋…„๋œ JJuice์ง‘'
console.log(this.home); //'์ œ์ฃผ๋„ ์ œ์ฃผ๋™ ์ œ์ฃผ์‹œ 35๋…„๋œ JJuice์ง‘'
console.log(this.jjuiceHouse); // undefined

์œ„์˜ ์ฝ”๋“œ์—์„œ this ๊ฐ€ ๊ณง window์ด๋‹ค.

โ— this.house=... ์˜ ์˜๋ฏธ๋Š” window๊ฐ์ฒด์— houseํ”„๋กœํผํ‹ฐ์— ๊ฐ’์„ ๋“ฑ๋กํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

โ— const jjuiceHouse = ...์˜ ์˜๋ฏธ๋Š” windows๊ฐ์ฒด์— jjuiceHouseํ”„๋กœํผํ‹ฐ๋กœ ๋“ฑ๋กํ•˜๋Š”๊ฒŒ ์•„๋‹Œ ์ฒ˜์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ˆœ๊ฐ„ ์ƒ์„ฑ๋˜๋Š” ์ „์—ญ ์ปจํ…์ŠคํŠธ๊ฐ์ฒด์— variable ํ”„๋กœํผํ‹ฐ์— ๋“ฑ๋กํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— console์— this.jjuiceHouse ๊ฒฐ๊ณผ๊ฐ’์ด undefined๊ฐ€ ๋‚˜์˜จ๋‹ค.

'์ „์—ญ ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด': {
    '๋ณ€์ˆ˜ ๊ฐ์ฒด' : {
        variable: ['jjuiceHouse'],
    },
    '์Šค์ฝ”ํ”„ ์ฒด์ธ': ['์ „์—ญ ๋ณ€์ˆ˜๊ฐ์ฒด'],
    'this': window,
}

๋งŒ์•ฝ const๊ฐ€ ์•„๋‹Œ var jjuiceHouse๋กœ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ–ˆ๋‹ค๋ฉด this.jjuiceHouse=...๊ฒฐ๊ณผ๊ฐ’์ด undefined๊ฐ€ ์•„๋‹Œ ์ •์ƒ์ ์ธ ๊ฐ’์ด ์ถœ๋ ฅ๋œ๋‹ค. (var๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” window๊ฐ์ฒด์— ํ”„๋กœํผํ‹ฐ๋กœ ๊ฐ’์ด ๋“ฑ๋ก๋œ๋‹ค๋ผ๋Š” ์˜๋ฏธ)
์‹ค์ œ ์ฝ”๋”ฉํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ this. or window. ์ด๋Ÿฐ์‹์œผ๋กœ ํ”„๋กœํผํ‹ฐ๊ฐ’์„ ๋“ฑ๋กํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†๋‹ค๊ณ  ํ•œ๋‹ค๋‹ˆ ์ด ์ •๋„๋งŒ ํ•˜๊ณ  ๋‹ค์Œ ๋‚ด์šฉ์œผ๋กœ ๋„˜์–ด๊ฐ€๋ณด์ž.

โ–  ํ•จ์ˆ˜์—์„œ์˜ this๊ฐ€ ๊ฐ€๋ฅดํ‚ค๋Š” ๊ฒƒ์€?

๋ณดํ†ต ๋ฐ‘์—์„œ์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ,

function callRepairShop() {
    console.log(this); 
}
callRepairShop();//window

์—ฌ๊ธฐ์„œ์˜ this๋„ ์œ„์˜ Global ์˜์—ญ์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ window๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค.

<๐Ÿ™„์™œ ๊ทธ๋Ÿฐ๊ฑธ๊นŒ?>

โ— ์œ„์—์„œ const jjuiceHouse=.. ์ „์—ญ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด > variable ํ”„๋กœํผํ‹ฐ์— ๋“ฑ๋ก๋˜๋Š”๊ฑฐ์ฒ˜๋Ÿผ ์ „์—ญ์—์„œ ์„ ์–ธ๋œ ํ•จ์ˆ˜ function callRepairShop(){}์—ญ์‹œ ์ „์—ญ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด > variable ํ”„๋กœํผํ‹ฐ์— ๋“ฑ๋ก๋˜๋Š” ๊ฒƒ์ด๋‹ค.

โ— ์˜ˆ๋ฅผ ๋“ค์–ด const jjuiceHouse=..์™€ function callRepairShop() {}๊ฐ€ Global์˜์—ญ์— ์ˆœ์„œ๋Œ€๋กœ ์„ ์–ธ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

const jjuiceHouse = '์ œ์ฃผ๋„ ์ œ์ฃผ์‹œ..';
function callRepairShop() { }

โ— ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ „์—ญ ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด๋กœ ํ‘œํ˜„ํ•ด๋ณด์ž.

'์ „์—ญ์ปจํ…์ŠคํŠธ': {
    '๋ณ€์ˆ˜ ๊ฐ์ฒด': {
        variable: [ {jjuiceHouse:'์ œ์ฃผ๋„..'}, {callRepirShop:'function'}]
    },
    '์Šค์ฝ”ํ”„ ์ฒด์ธ': ['์ „์—ญ ๋ณ€์ˆ˜๊ฐ์ฒด'],
    'this': window
}

'callRepairShop()'ํ•จ์ˆ˜๋ฅผ ํ’ˆ๊ณ  ์žˆ๋Š” ๊ฑด ๋ฐ”๋กœ '์ „์—ญ ์ปจํ…์ŠคํŠธ'์ด๊ณ  ์ด '์ „์—ญ์ปจํ…์ŠคํŠธ'์˜ this๋Š” window๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค.

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

//callReairShop(); ํ•จ์ˆ˜ ์‹คํ–‰์‹œ
'callRepairShopํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ': {
   '๋ณ€์ˆ˜๊ฐ์ฒด': { variable: null },
       '์Šค์ฝ”ํ”„์ฒด์ธ': {['callRepairShop๋ณ€์ˆ˜๊ฐ์ฒด','์ „์—ญ ๋ณ€์ˆ˜ ๊ฐ์ฒด']},
    this: window
}

โšก๊ธฐ์–ตํ•ด๋‘๋ฉด ์ข‹์„ ๋‚ด์šฉ : 'ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ'๋Š” ํ•จ์ˆ˜ ์‹คํ–‰์‹œ ์ƒ์„ฑ๋˜์ง€๋งŒ '์Šค์ฝ”ํ”„์ฒด์ธ'์€ ํ•จ์ˆ˜ ์„ ์–ธ์‹œ ๋ฒ”์œ„๊ฐ€ ์ง€์ •๋œ๋‹ค. ->'๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„'๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋‹ค.