์ƒˆ์†Œ์‹

Languages/Java Script

[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)๋ฅผ ๋งฅ๋ฝ์œผ๋กœ ์‹คํ–‰๋˜๊ฒŒ ๋œ๋‹ค.

๋ฐ˜์‘ํ˜•
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.