Language/JavaScript

πŸ“š return function() ν•¨μˆ˜λ₯Ό 리턴 ν•˜λŠ” 기법은 어디에 μ‚¬μš©λ κΉŒ?

인파_ 2021. 9. 29. 06:20

function-return

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜

ν΄λ‘œμ €μ—μ„œλ„ λ³΄μ•˜κ³  μš°λ¦¬λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ”©ν•˜λ©΄μ„œ 가끔 ν•¨μˆ˜ 자체λ₯Ό λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜λ₯Ό ν•œλ²ˆμ―€μ€ λ³΄μ•˜μ„ 것이닀.

function hello(){
   return function world(){
      return "Hello Word";
   }
}

const a = hello();
    // == world()

β€‹μ›λ¦¬λŠ” μ•Œκ² λ‹€. μ‚¬μš©λ²•λ„ μ•Œκ² λ‹€. 그런데 λŒ€μ²΄ μ΄λŸ¬ν•œ 기법이 어디에 μ“°μ΄λŠ”κ±΄κ°€? μ™œ ꡳ이 값을 λ¦¬ν„΄ν•˜λ©΄λ˜μ§€ ν•¨μˆ˜μ•ˆμ— ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜λŠ”κ°€? μ§€κΈˆλΆ€ν„° return function() {} 의 μ‹€μš© 기법을 μ•Œμ•„λ³΄μž.

 

일반적인 이벀트 콜백 ν•¨μˆ˜ 등둝법

μ—¬κΈ° λ²„νŠΌμ΄ 3개 μžˆλŠ” μ›Ήλ¬Έμ„œκ°€ μžˆλ‹€.

<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
   <button id="c1">C1</button>
   <button id="c2">C2</button>
   <button id="c3">C3</button>

   <script>
   
   </script>
</body>
</html>

μš°λ¦¬λŠ” μ € 3개의 λ²„νŠΌλ§ˆλ‹€ λ‹€μŒκ³Ό 같이 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό 등둝할 μ˜ˆμ •μ΄λ‹€. addEventListenr λ‘λ²ˆμ§Έ μΈμžμ—λŠ” ν•¨μˆ˜κ°€ λ“€μ–΄κ°€κΈ° λ•Œλ¬Έμ— 읡λͺ…ν•¨μˆ˜λ‘œ μ²˜λ¦¬ν•΄μ£Όμ—ˆλ‹€.

<body>
   <button id="c1">C1</button>
   <button id="c2">C2</button>
   <button id="c3">C3</button>

   <script>
      document.getElementById('c1').addEventListener('click', function(){ console.log(1) });
      document.getElementById('c2').addEventListener('click', function(){ console.log(1) });
      document.getElementById('c3').addEventListener('click', function(){ console.log(1) });
   </script>
</body>

μ½”λ“œ μžμ²΄μ— λ¬Έμ œλŠ” μ—†μ§€λ§Œ κ°€λ§Œ 보면 μ½”λ“œ 반볡이 λ°œμƒν•œλ‹€. λ”°λΌμ„œ λ™μΌν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ°–μœΌλ‘œ λΉΌμ„œ λ¦¬νŒ©ν† λ§ ν•œλ‹€. c λΌλŠ” ν•¨μˆ˜λ₯Ό μƒˆλ‘œ λ§Œλ“€κ³  μ΄λ²€νŠΈλ¦¬μŠ€λ„ˆμ— λ“±λ‘μ‹œν‚€λ©΄ λœλ‹€. λ‹€λ§Œ λͺ¨λ‘ λ‹€ μ•Œλ‹€μ‹œν”Ό 이벀트 λ¦¬μŠ€λ„ˆ μΈμžμ—λŠ” ν•¨μˆ˜ μžμ²΄κ°€ λ“€μ–΄κ°€μ•Ό ν•œλ‹€. 만일 ν•¨μˆ˜ 인자 뢀뢄에 c()둜 λ„£κ²Œ 되면 리턴값 μžμ²΄κ°€ λ“€μ–΄κ°€λŠ” 꼴이 되기 λ•Œλ¬Έμ— ν•¨μˆ˜ 싀행이 λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€.

<script>
  function c() {
     console.log(1);
  }

  document.getElementById('c1').addEventListener('click', c);
  document.getElementById('c2').addEventListener('click', c);
  document.getElementById('c3').addEventListener('click', c);
</script>

 

이벀트 μ½œλ°±μ— λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•  경우

그런데 만일 μŠ€νŽ™μ΄ λ³€κ²½λ˜μ„œ, 각 λ²„νŠΌλ§ˆλ‹€ λ‹€λ₯Έ λ™μž‘μ„ ν•˜λ„λ‘ κ΅¬ν˜„ν•œλ‹€λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Όν• κΉŒ? 예λ₯Ό λ“€μ–΄ c1λ²„νŠΌ λˆ„λ₯΄λ©΄ 1이 좜λ ₯되게 λ§Œλ“€κ³  c3 λ²„νŠΌ λˆ„λ₯΄λ©΄ 3이 좜λ ₯되게 λ§Œλ“€κ³  μ‹Άλ‹€. μ΄λŠ” ν•¨μˆ˜μ— νŒŒλΌλ―Έν„°λ₯Ό μ€˜μ„œ νŒŒλΌλ―Έν„° λ³€μˆ˜κ°’μ„ 좜λ ₯ν•΄μ£Όλ©΄ λ˜λŠ” 방법이닀. ν•˜μ§€λ§Œ λ¬Έμ œλŠ” μ–΄λ–»κ²Œ μ€„κΉŒ? 이닀.

μ•„λž˜μ™€ 같이 ν•˜λ©΄ μ•žμ„œ λ§ν–ˆλ‹€ 싢이 λ¦¬ν„΄κ°’을 λ„£μ–΄λ²„λ¦¬λŠ” 꼴이 λœλ‹€. λ²„νŠΌ λˆ„λ₯΄μ§€λ„ μ•Šμ•˜λŠ”λ°λ„ console.log() ν•¨μˆ˜κ°€ ν•œλ²ˆ μ‹€ν–‰ν•˜κ³ λ§ˆλŠ” 기적을 λ³Ό 수 μžˆμ„ 것이닀.

function c(n) {
   console.log(n);
}

document.getElementById('c2').addEventListener('click', c(2));

 

즉, c둜 μ£Όλ©΄ νŒŒλΌλ―Έν„°λ₯Ό μ€„μˆ˜μ—†κ³ , c(2)둜 ν•˜λ©΄ ν•¨μˆ˜ 싀행이 μ•ˆλ˜κ²Œ λœλ‹€. μ • 방법이 μ—†λŠ”κ±ΈκΉŒ? λ¬΄μ‹ν•˜κ²Œ μ „μ—­λ³€μˆ˜λ‘œ μ²˜λ¦¬ν• κΉŒ? 라고 μ‹Άμ§€λ§Œ 사싀 κ°„λ‹¨ν•˜λ‹€.

 

ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ ν΄λ‘œμ €

​c()둜 μ΄λ²€νŠΈλ¦¬μŠ€λ„ˆ ν•¨μˆ˜μ— λ“±λ‘ν•˜λ©΄ λ™μž‘μ΄ μ΄μƒν•˜κ²Œ λ˜λŠ” μ΄μœ λŠ”, 이벀트 λ¦¬μŠ€λ„ˆμ—λŠ” ν•¨μˆ˜κ°€ λ“±λ‘λ˜λŠ”κ²Œ μ•„λ‹ˆλΌ 리턴값이 넣어지기 λ•Œλ¬Έμ΄λ‹€. 그럼 이 원리λ₯Ό μ΄μš©ν•˜λ©΄ λœλ‹€. ν˜ΈμΆœν•œ ν•¨μˆ˜μ—μ„œ μ•„μ˜ˆ ν•¨μˆ˜ 자체λ₯Ό 리턴 μ‹œμΌœλ²„λ¦¬λ©΄, 리턴값이 곧 ν•¨μˆ˜μ΄κ²Œ 되고, μ΄λŠ” 곧 ν•¨μˆ˜ 등둝이 λ˜μ§€ μ•Šμ„κΉŒ?

function c(n) {
   return function(){
      console.log(n);
   }
}

document.getElementById('c1').addEventListener('click', c(1));
document.getElementById('c2').addEventListener('click', c(2));
document.getElementById('c3').addEventListener('click', c(3));

μ΄λ ‡κ²Œ ν•˜λ©΄ 이벀트 λ¦¬μŠ€λ„ˆλŠ” ν•¨μˆ˜κ°€ λ¦¬ν„΄λœ ν•¨μˆ˜λ₯Ό(ν΄λ‘œμ € μ²˜λ¦¬κ°€ 된) λ“±λ‘ν•˜κ²Œ 된 꼴이 λœλ‹€.

 

[JS] πŸ“š ν΄λ‘œμ € (Closure) κ°œλ… μ™„λ²½ 정리

ν΄λ‘œμ €(closure) λž€? ν΄λ‘œμ €λŠ” λ°˜ν™˜λœ λ‚΄λΆ€ν•¨μˆ˜κ°€ μžμ‹ μ΄ 선언됐을 λ•Œμ˜ ν™˜κ²½(Lexical environment)인 μŠ€μ½”ν”„λ₯Ό κΈ°μ–΅ν•˜μ—¬, 만일 μžμ‹ μ΄ 선언됐을 λ•Œμ˜ ν™˜κ²½(μŠ€μ½”ν”„) λ°–μ—μ„œ ν˜ΈμΆœλ˜μ–΄λ„ μŠ€μ½”ν”„μ— μ ‘κ·Όν• 

inpa.tistory.com

 

ν™”μ‚΄ν‘œ ν•¨μˆ˜λ‘œ ν‘œν˜„ν•˜κΈ°

쒀더 ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜ μ½”λ“œμ‹μ„ κ°„κ²°ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄ ν™”μ‚΄ν‘œ ν•¨μˆ˜λ‘œ λ‚˜νƒ€λ‚΄λ©΄ λ‹€μŒκ³Ό 같이 ν‘œν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.

const c = (n) => () => { //ν™”μ‚΄ν‘œ ν•¨μˆ˜κ°€ ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•œλ‹€.
   console.log(n);
}

document.getElementById('c1').addEventListener('click', c(1));
document.getElementById('c2').addEventListener('click', c(2));
document.getElementById('c3').addEventListener('click', c(3));
β€‹μ²˜μŒλ³΄λ©΄ κ΄΄μƒν•œ 문법 ν‘œν˜„μ— ν˜€λ₯Ό 내두λ₯΄κ² μ§€λ§Œ ν™•μ‹€νžˆ μ½”λ“œλŸ‰μ„ μ€„μ΄λŠ” κΈ°λ²•μ΄λ‹ˆ μ΅μˆ™ν•΄ μ§€λŠ” 것이 μ’‹λ‹€.