[Js] ํจ์์ ํธ์ถ | ์๋ฐ์คํฌ๋ฆฝํธ ํจ์ ํธ์ถ | apply
- -
ํด๋น ํฌ์คํ ์ "์ํ์ฝ๋ฉ"์ ์ด๊ณ ์ ๋์ ๊ฐ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ๋ฆฐ ๊ฒ์๊ธ ์ ๋๋ค.
์์ ์ ์ธ ์ฉ๋๊ฐ ์๋, ๊ฐ์ธ ๊ณต๋ถ ์ ๋ฆฌ ๋ชฉ์ ์ผ๋ก ์ฌ๋ฆฌ๋ ๊ธ์์ ๋ฏธ๋ฆฌ ์๋ฆฝ๋๋ค.
ํจ์ํธ์ถ
ํจ์์ ๋ํ ๊ธฐ๋ณธ ์์ ์์ ํจ์๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ์์๋ดค๋ค. ์๋๋ ํจ์๋ฅผ ํธ์ถํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
<script>
function func(){
}
func();
</script>
์๋ฐ์คํฌ๋ฆฝํธ์์ ํจ์๋ผ๋ ๊ฒ์ ์ผ์ข ์ ๊ฐ์ฒด์ด๋ค.
๊ฐ์ฒด๋ ์์ฑ๋ค์ ๊ฐ์ง๊ณ ์๋ค.
์ด ์์ฑ์ ๊ฐ์ด ์ ์ฅ๋์ด ์๋ค๋ฉด "์์ฑ"์ด๋ผ๊ณ ํ๊ณ , ํจ์๊ฐ ์ ์ฅ๋์ด ์๋ค๋ฉด ์ด๊ฒ์ "๋ฉ์๋"๋ผ๊ณ ๋ถ๋ฅธ๋ค.
JavaScript๋ ํจ์๋ฅผ ํธ์ถํ๋ ํน๋ณํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
๋ณธ ํ ํฝ์ ์์์์ ํจ์๋ฅผ ๊ฐ์ฒด๋ผ๊ณ ํ๋ค. ์์ ์์ ์์ ํจ์ func๋ Function์ด๋ผ๋ ๊ฐ์ฒด์ ์ธ์คํด์ค๋ค.
๋ฐ๋ผ์ func๋ ๊ฐ์ฒด Function์ด ๊ฐ์ง๊ณ ์๋ ๋ฉ์๋๋ค์ ์์ํ๊ณ ์๋ค.
์ง๊ธ ์ด์ผ๊ธฐํ๋ ค๋ ๋ฉ์๋๋ Function.apply๊ณผ Function.call์ด๋ค. ์ด ๋ฉ์๋๋ค์ ์ด์ฉํด์ ํจ์๋ฅผ ํธ์ถํด๋ณด์.
<script>
function sum(arg1, arg2){
return arg1+arg2;
}
alert(sum.apply(null, [1,2]))
</script>
๊ฒฐ๊ณผ๋ 3์ด๋ค.
์ฆ, ์ฝ๊ฒ ๋งํ์๋ฉด ๊ธฐ๋ณธ ํจ์ ํธ์ถ๋ฐฉ๋ฒ์ด์ธ์๋ ํจ์๊ฐ ๊ฐ์ง ๋ฉ์๋๋ค์ ํตํ์ฌ ํจ์ ํธ์ถ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค.
ํจ์ . ์ ํ๋ฉด ํจ์ ์์ ๋ฉ์๋๋ฅผ ํ์ธํ ์ ์๋ค.
โป ๋ด์ฅ๋ ์ฝ๋์ ๊ฒฝ์ฐ native code๋ผ๊ณ ์ถ๋ ฅ๋จ.
์์ ๊ฐ์ ๊ฒฝ์ฐ๋ ๋ถํธํ์ฌ ์ธ ์ผ์ด ์์ ๊ฒ์ด๋ค ์๊ฐํ ์ ์์ง๋ง, ์ธ์์ ๊ฐ์ ์ ์ธํ null๋ถ๋ถ์ ์ดํด๋ณด๋ฉด
์ด ๋ฉ์๋์ ํ์์ฑ์ ์ ์ ์๋ค.
์ฆ null์ด ์๋ ๋ค๋ฅธ ๊ฐ์ด ๋ค์ด์ค๊ฒ ๋๋ ๊ฒฝ์ฐ ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
ํจ์ sum์ Function ๊ฐ์ฒด์ ์ธ์คํด์ค๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด Function ์ ๋ฉ์๋ apply๋ฅผ ํธ์ถ ํ ์ ์๋ค.
apply ๋ฉ์๋๋ ๋๊ฐ์ ์ธ์๋ฅผ ๊ฐ์ง ์ ์๋๋ฐ, ์ฒซ๋ฒ์งธ ์ธ์๋ ํจ์(sum)๊ฐ ์คํ๋ ๋งฅ๋ฝ์ด๋ค.
๋งฅ๋ฝ์ ์๋ฏธ๋ ๋ค์ ์์ ๋ฅผ ํตํด์ ์ดํด๋ณด์. ๋๋ฒ์งธ ์ธ์๋ ๋ฐฐ์ด์ธ๋ฐ, ์ด ๋ฐฐ์ด์ ๋ด๊ฒจ์๋ ์์๊ฐ ํจ์(sum)์ ์ธ์๋ก ์์ฐจ์ ์ผ๋ก ๋์ ๋๋ค. Function.call์ ์ฌ์ฉ๋ฒ์ด ๊ฑฐ์ ๋น์ทํ๋ค ์ฌ๊ธฐ์๋ ์ธ๊ธํ์ง ์๋๋ค.
์ข ๋ ํฅ๋ฏธ๋ก์ด ์์ ๋ฅผ ์ดํด๋ณด์. ๊ฒฐ๊ณผ๋ 6๊ณผ 185์ด๋ค.
<script>
o1 = {val1:1, val2:2, val3:3}
o2 = {v1:10, v2:50, v3:100, v4:25}
function sum(){
var _sum = 0;
for(name in this){
_sum += this[name];
}
return _sum;
}
alert(sum.apply(o1)) // 6
alert(sum.apply(o2)) // 185
//์ฆ sum์ด๋ผ๋ ํจ์๋ฅผ ํธ์ถํ ๋, null์ด์๋ o1,o2๋ผ๋ ๊ฐ์ฒด๋ก ์ธ์๋ฅผ ์ ๋ฌํ ๊ฒ
</script>
this๋ ๋ฌด์์ผ๊น?
์ด ๋งฅ๋ฝ์์ this๋ ํ์ฌ ์ ํด์ ธ์์ง ์๋ค. ํธ์ถํ ๋ ์ ํด์ง๊ธฐ ๋๋ฌธ์ด๋ค.
sum.apply๋ฅผ ํ๊ฒ ๋๋ฉด sum์ด ํธ์ถ๋๋๋ฐ, o1์ ์ธ์๋ก ์ฃผ๊ฒ ๋๋ค.
์ด๋ ๊ฒ ๋๋ฉด o1์ด sumํจ์์ this๊ฐ ๋๋ ๊ฒ์ด๋ค.
์ฆ var this = o1; ์ด๋ผ๋ ์ฝ๋๊ฐ ์์์ ์ผ๋ก ์์ฑ๋ ๊ฒ์ด๋ ๋ค๋ฆ ์๋ ๊ฒ์ด๋ค.
์์ ๊ฐ ๋ณต์กํด๋ณด์ด์ง๋ง ํ๋์ฉ ๋ถํดํด์ ์๊ฐํด๋ณด๋ฉด ์ด๋ ต์ง ์๋ค.
์ฐ์ ๋๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์๋ค. o1๋ 3๊ฐ์ ์์ฑ์ ๊ฐ์ง๊ณ ์๋ค. ๊ฐ๊ฐ์ ์ด๋ฆ์ val1, val2,val3์ด๋ค.
o2๋ 4๊ฐ์ ์์ฑ์ ๊ฐ์ง๊ณ ์๊ณ o1๊ณผ๋ ๋ค๋ฅธ ์์ฑ ์ด๋ฆ์ ๊ฐ์ง๊ณ ์๊ณ ์์ฑ์ ์๋ ๋ค๋ฅด๋ค.
๊ทธ ๋ค์์ ํจ์ sum์ ๋ง๋ค์๋ค.
์ด ํจ์๋ ๊ฐ์ฒด์ ์์ฑ์ ์ด๊ฑฐํ ๋ ์ฌ์ฉํ๋ for in ๋ฌธ์ ์ด์ฉํด์ ๊ฐ์ฒด ์์ (this)์ ๊ฐ์ ์ด๊ฑฐํ ํ์ ๊ฐ ์์ฑ์ ๊ฐ์ ์ง์ญ๋ณ์ _sum์ ์ ์ฅํ ํ์ ์ด๋ฅผ ๋ฆฌํดํ๊ณ ์๋ค.
๊ฐ์ฒด Function์ ๋ฉ์๋ apply์ ์ฒซ๋ฒ์งธ ์ธ์๋ ํจ์๊ฐ ์คํ๋ ๋งฅ๋ฝ์ด๋ค.
์ด๋ ๊ฒ ์๊ฐํ์.
sum.apply(o1)์ ํจ์ sum์ ๊ฐ์ฒด o1์ ๋ฉ์๋๋ก ๋ง๋ค๊ณ sum์ ํธ์ถํ ํ์ sum์ ์ญ์ ํ๋ค.
์๋์ ๋น์ทํ๋ค. (์คํ๊ฒฐ๊ณผ๊ฐ ์กฐ๊ธ ๋ค๋ฅผ ๊ฒ์ด๋ค.
๊ทธ๊ฒ์ ํจ์ for in๋ฌธ์ผ๋ก ๊ฐ์ฒด o1์ ๊ฐ์ ์ด๊ฑฐํ ๋ ํจ์ sum๋ ํฌํจ๋๊ธฐ ๋๋ฌธ์ด๋ค.)
์๋๋ ์ ์ฝ๋๋ฅผ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ํํํ ๊ฒ์ด๋ค.
<!DOCTYPE html>
<html>
<head>
<title>ํจ์์ ํธ์ถ</title>
</head>
<body>
<script type="text/javascript">
function sum(){
var _sum =0;
for(name in this){//this๋ ์ ๋ฌ๋ฐ๋ ์ธ์.
if(typeof this[name] !== 'function')//this์ ๊ฐ ํ์
์ด function์ด ์๋ ๊ฒฝ์ฐ๋ง ์ถ๋ ฅ
_sum += this[name];
}
return _sum;
}
o1 = {val1:1, val2:2, val3:3, sum:sum}
o2 = {v1:10, v2:50, v3:100, v4:25, sum:sum}
alert(o1.sum());
alert(o2.sum());
</script>
</body>
</html>
ํ์ง๋ง ์ด๋ฌํ ๋ฐฉ๋ฒ์ ๋ถํธํ ์ ๋ ๋ง๊ณ , ์ฝ๋๋ ๋์กํ๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ apply๋ฅผ ์ฌ์ฉํ์ฌ ํจ์๊ฐ ํธ์ถ๋๋ ์์ ์์ ํจ์์ this๊ฐ์ ํ๋ก๊ทธ๋๋ฐ ์ ์ผ๋ก ๋ณ๊ฒฝํ์ฌ,
๋ง์น ํจ์๊ฐ o1์ ์์ฑ์ธ ๊ฒ์ฒ๋ผ ์คํ์ํฌ ์ ์๋ค๋ ๊ฒ์ด๋ค.
<script>
o1.sum = sum;
alert(o1.sum());
delete o1.sum();
</script>
sum์ o1 ์์์ ๋ฉ์๋๊ฐ ๋๋ค๋ ๊ฒ์ ์ด๋ ๊ฒ ๋ฐ๊ฟ ๋งํ ์ ์๋ค.
ํจ์ sum์์ this์ ๊ฐ์ด ์ ์ญ๊ฐ์ฒด๊ฐ ์๋๋ผ o1์ด ๋๋ค๋ ์๋ฏธ๋ค.
์ผ๋ฐ์ ์ธ ๊ฐ์ฒด์งํฅ ์ธ์ด์์๋ ํ๋์ ๊ฐ์ฒด์ ์์๋ ํจ์๋ ๊ทธ ๊ฐ์ฒด์ ์์ ๋ฌผ์ด ๋๋ค. ํ์ง๋ง JavaScript์์ ํจ์๋ ๋
๋ฆฝ์ ์ธ ๊ฐ์ฒด๋ก์ ์กด์ฌํ๊ณ , apply๋ call ๋ฉ์๋๋ฅผ ํตํด์ ๋ค๋ฅธ ๊ฐ์ฒด์ ์์ ๋ฌผ์ธ ๊ฒ์ฒ๋ผ ์คํํ ์ ์๋ค. ํฅ๋ฏธ๋กญ๋ค.
๋ง์ฝ apply์ ์ฒซ๋ฒ์งธ ์ธ์๋ก null์ ์ ๋ฌํ๋ฉด apply๊ฐ ์คํ๋ ํจ์ ์ธ์คํด์ค๋ ์ ์ญ๊ฐ์ฒด(๋ธ๋ผ์ฐ์ ์์๋ window)๋ฅผ ๋งฅ๋ฝ์ผ๋ก ์คํ๋๊ฒ ๋๋ค.
'Languages > Java Script' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Js] ์์ฑ์์ new | javascript์ ๊ฐ์ฒด ์งํฅ ํน์ง | ๊ฐ์ฒด (0) | 2021.02.04 |
---|---|
[Js] ๊ฐ์ฒด์งํฅ | javascript ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ | ๋ฌธ๋ฒ (0) | 2021.02.04 |
[Js] arguments | ๋ฐฐ์ด | javascript ๋ฐฐ์ด | ๋งค๊ฐ๋ณ์ (0) | 2021.02.04 |
[Js] ํด๋ก์ | ์ธ๋ถํจ์, ๋ด๋ถํจ์ (0) | 2021.02.04 |
๋น์ ์ด ์ข์ํ ๋งํ ์ฝํ ์ธ
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค