this
๋ด๊ฐ ๊ตญ๋ฏผํ๊ต 2,3ํ๋
๋ (1992๋
์ ๋?) 3-4๋ช
์ด ๊ทธ๋ฃน์ ์ง์ด 1์กฐ๋ฅผ ์ด๋ค ๋งค ์ฃผ ๊ฐ ์ง์ผ๋ก ๋กํ
์ด์
ํ๋ฉด์ ์์ด์ ์๋์ ๋ชจ์๊ณ ํ์ตํ๋๊ฒ ์ ํ์ด์๋ค. ๊ทธ๋ ํต์ฌ ์๋ฃ๋ ์์ด ๋น๋์ค์๋ค. (์ง๊ธ์ ์ฐพ์๋ณด๊ธฐ๋ ํ๋ ๋น๋์ค ํ
์ดํ์ด์ง๋ง..) ๋ค๋ฅธ ๊ฑด ๊ธฐ์ต์ด ํ๋๋ ๋์ง ์์ง๋ง, ์์ํ ๋๋ฌผ์ด ๋์ ์์ํ ์์ด ๋
ธ๋๋ฅผ ๋ถ๋ฅด๋ ์ฅ๋ฉด์ ์ด๋ ดํ์ด ๊ธฐ์ต์ด ๋๋ค.(์ด ๋๋ฌผ์ ๊ณผ์ฐ ๋ฌด์์ด์์๊น?)
"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.
orwindow.
์ด๋ฐ์์ผ๋ก ํ๋กํผํฐ๊ฐ์ ๋ฑ๋กํ๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์๋ค๊ณ ํ๋ค๋ ์ด ์ ๋๋ง ํ๊ณ ๋ค์ ๋ด์ฉ์ผ๋ก ๋์ด๊ฐ๋ณด์.
โ ํจ์์์์ 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 }
โก๊ธฐ์ตํด๋๋ฉด ์ข์ ๋ด์ฉ : 'ํจ์ ์ปจํ ์คํธ'๋ ํจ์ ์คํ์ ์์ฑ๋์ง๋ง '์ค์ฝํ์ฒด์ธ'์ ํจ์ ์ ์ธ์ ๋ฒ์๊ฐ ์ง์ ๋๋ค. ->'๋ ์์ปฌ ์ค์ฝํ'๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค.