November 01, 2020
์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ด์์ ํจ์๋
๋๋ผ์ด ์กด์ฌ์ด๋ค. ๊ทธ๋งํผ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ ์ฐํ๋ฉฐ ํจ์๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ ๋ฐ๋ผ ์ฐธ ๋ณํ๋ฌด์ํด ์ง๋๊ตฌ๋.
์ด์ object ์ function ์ ๊ด๊ณ๋ฅผ ๊ท์ ํด ๋ณด์.
const kim = { name: 'kim', first: 10, second: 20 }
const lee = { name: 'lee', first: 10, second: 10 }
์๋ก ๊ด๊ณ๊ฐ ์๋ ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํด ์ฃผ๊ณ , ์ด๋ค ๊ฐ์ฒด์.first ๊ทธ๋ฆฌ๊ณ second ๊ฐ์ ๋ํด ๋ฆฌํดํ๋ ๊ธฐ๋ฅ์ sum() ํจ์๋ฅผ ๊ทธ๋ฅ ๋ฐ์๋ค ์ ์ธํด ๋์๋ค.
function sum() {
return this.first + this.second
}
์ค์? sum() ํจ์๋ ํ์ฌ ์ด๋ค ๊ฐ์ฒด์๋ ์ํด ์์ง ์๋ค. ํผ์ ์๋ฐ์ฒ๋ผ ์๋ ์ํ์ด๋ค.
์ด์จ๋ ๊ฐ์ฒด ๋ด์ first ์ second ๋ฅผ ๋ํด์ฃผ๋ ์ญํ ์ ํ๋ sum(),
์ด์ ์ด๋ป๊ฒ ์จ์ค์ผ ํ ๊น?
sum.call()
sum ์ด๋ผ๊ณ ํ๋ ๊ฐ์ฒด๋ฅผ ์คํ์ํจ๋ค๋ ์๋ฏธ์ธ๋ฐ, sum() ๊ณผ ์๋ฏธ๊ฐ ๊ฐ๋ค.
๊ทธ๋ผ ์ call ์ ๋ถ์ฌ ์ฐ๋๊ฑด๊ฐ ํ๋ฉด,
์ผ๋จ call() ์ด๋ผ๊ณ ํ๋ ๋ฉ์๋๋ ์ด.. ๋ชจ๋ ํจ์๋ call ์ด๋ผ๊ณ ํ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
call ์ด๋ผ๊ณ ํ๋ ํจ์์ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก kim ์ ์ฃผ๋ฉด,
sum.call(kim)
function sum() {
return this.first + this.second
} //sum.call(kim)๊ฐ ์คํ๋๋ฉด์ ํจ์ ๋ด๋ถ์ ์ผ๋ก this ๊ฐ kim ์ด ๋๋ค.
30
์ฆ, sum() ์ด๋ผ๋ ํจ์๋ ๋ณธ๋ kim ์ด๋ผ๋ ๊ฐ์ฒด์ ๋ฉค๋ฒ๊ฐ ์๋์๋ค. ์๊น ๋งํ๋ ํผ์ ๋๊ณ ์์๋ค.
๊ทผ๋ฐ sum ํจ์๋ฅผ ์คํํ๋ค๊ณ ํ๋ฉด์ ๊ฐ์๊ธฐ call ์ด๋ผ๊ณ ํ๋ ํน์ดํ ๊ฑธ ์จ๊ฐ์ง๊ณ ์๋,
call ์ ์ฒซ๋ฒ์งธ ์ธ์๋ก sum ์ด ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ this ์ ๊ฐ์ kim ์ผ๋ก ์ง์ ํ๋๋,
sum ์ด๋ผ๋ ํจ์๊ฐ ๋น๋ก์ kim ์ ๋ฉค๋ฒ์ธ ๋ฉ์๋๊ฐ ๋์๋ค.
๊ทธ๋ฆฌ๊ณ sum.call(kim) ์ ์ธ์๋ฅผ ๋ช๊ฐ ๋ ๋ฐ์ ์๋ ์๋ค.
function sum(bonusP) {
return bonusP + (this.first + this.second)
}
sum.call(kim)
NaN
๊ธฐ์กด ์ ์ํด ๋์ sum ํจ์๊ฐ bonusP ๋ผ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ๊ณ ๊ธฐ์กด ๊ฐ์ bonusP ๋ฅผ ๋ํ ๊ฐ์ ๋ฆฌํดํ๋๋ก ์์ ํ๊ณ sum ํจ์์ kim ๊ฐ์ฒด๋ฅผ ๋ถ๋ฌ์ ์คํํ๋ค.
์์ ๊ฒฐ๊ณผ์ฒ๋ผ NaN ๊ฐ ๋์จ๋ค.
์ฆ bonusP ๊ฐ ์๋ ๊ฐ์ด๋ค. ์๋ ๊ฐ์ ๋ํ๊ธฐ ๋๋ฌธ์ ์ ๋๋ก ์คํ์ด ๋์ง ์์๋ค.
๊ทธ๋ฆฌํด์,
sum.call(kim, 100)
130
call ์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก๋ ๊ทธ ํจ์์ ๋ด๋ถ์ ์ผ๋ก this ๋ฅผ ๋ญ๋ก ํ ๊ฒ์ธ๊ฐ ๊ฐ ์ค๊ฒ ๋๊ณ ,
๋ ๋ฒ์งธ ์ธ์๋ถํฐ๋ ์ฐ๋ฆฌ๊ฐ ํธ์ถํ๋ ค๋ ํจ์์ ํ๋ผ๋ฏธํฐ์ (bonusP) ๋ค์ด๊ฐ ์ธ์๊ฐ๋ค์ด ๋ค์ด๊ฐ๋ค.
์ด๋ค ํจ์๋ฅผ ์คํํ ๋๋ง๋ค ์ด๋ค ๊ฐ์ฒด์ this ๊ฐ์ ๋ฐ๊พธ๋, ๋ค์๋งํด context ๋ฅผ ๋ฐ๊พธ๋ ๋ช ๋ น์ด call ์ ๋ํด ํ์ตํด ๋ณด์๋ค.
์ฎ๋๋ค. ๋ฌถ๋๋ค์ ์๋ฏธ์ธ bind
sum ์ด๋ผ๊ณ ํ๋ ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค this ๋ฅผ ๋ฐ๊พธ๋ ๊ฒ์ด ์๋๋ผ ์์ ํจ์์ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ this ๋ฅผ ๋ค๋ฅธ ์ด๋ค ํน์ ํ ๊ฑธ๋ก ๋ฑ ๊ณ ์ ์์ผ ๋ฒ๋ฆฌ๋ ๊ฒ ๋ฐ๋ก bind ๋ผ๊ณ ํ๋ค.
sum.bind(kim);
๋ง์ฐฌ๊ฐ์ง๋ก bind ์๋ sum ํจ์ ๋ด๋ถ์ ์ผ๋ก this ๋ฅผ ๋ญ ๋ก ์ธ ๊ฒ์ด๋์ ๋ํ ๊ฒ์ผ๋ก ์ฒซ๋ฒ์งธ ์ธ์๋ฅผ ๋ฐ์๋ค.
์ด์ sum ์ด๋ผ๊ณ ํ๋ ํจ์๋ ๋๊ฐ์๋ฐ ๋ด๋ถ์ ์ผ๋ก this ๋ฅผ kim ์ผ๋ก ํ๋
โ์๋ก์ด ํจ์โ ๊ฐ ๋ง๋ค์ด ์ง๋ค.
const kimSum = sum.bind(kim, '๐')
// call ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํจ์๊ฐ ํธ์ถ๋ ๋ ์ฌ์ฉํ ์ธ์๋ฅผ ์ง์ ํ ์ ์๋ค.
kimSum()
;('๐30')
sum() ์ ๋ฐ๋์ง ์์๋ค. ๋จ์ง sum ์ด ์ทจ์ง์ ๋ง๊ฒ ๋ฌ๋ผ์ง ์๋ก์ด ํจ์๊ฐ ๋ง๋ค์ด์ ธ์ ๋ฆฌํด๋ ๊ฒ์ด๋ค.
sum() ์๋ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
call ์ ํจ์๋ฅผ ์คํํ ๋ this ์ ์ปจํ ์คํธ๋ฅผ ๋ฐ๊พผ๋ค.
bind ๋ฅผ ํตํด sum ์ ์ด๋ค ํจ์์ ๋ด๋ถ์ this ๊ฐ์ โ์๊ตฌ์ โ ์ผ๋ก ๋ฐ๊พธ๋ ์๋ก์ด ํจ์๋ฅผ ๋ง๋ค์ด๋ธ๋ค.
call ๋ฉ์๋๋ ์ฃผ์ด์ง this ๊ฐ ๋ฐ ๊ฐ๊ฐ ์ ๋ฌ๋ ์ธ์์ ํจ๊ป ํจ์๋ฅผ ํธ์ถํ๋ค.
bind ๋ฉ์๋๋ ํธ์ถ๋๋ฉด ์๋ก์ด ํจ์๋ฅผ ์์ฑํ๊ณ ,
๋ฐ๊ฒ๋๋ ์ฒซ ์ธ์์ value๋ก๋ this keyword๋ฅผ ์ค์ ํ๋ฉฐ, ์ด์ด์ง๋ ์ธ์๋ค์ ๋ฐ์ธ๋๋ ํจ์์ ์ธ์์ ์ ๊ณต๋๋ค.