즉시 실행 함수란 무엇일까?

함수 정의와 동시에 즉시 호출되는 함수를 즉시 실행 함수라고 한다.

코드로 예를 들어보자.

<script>
(function(){
var a = 3 ;
var b = 5;
return a * b;
}())
</script>

위 코드는 익명 즉시 실행 함수이다.

즉시 실행 함수는 함수 이름이 없는 익명 함수를 사용하는 것이 일반적이다.

<script>
 (function foo (){
 var a = 3;
 var b = 5;
 return a * b ;
 }())
 foo() // ReferenceError : foo is not defined
</script>

하지만 그룹 연산자 내의 기명함수는 함수 선언문이 아니라 함수 리터럴로 평가된다.

무슨 소리냐면 () << 요녀석안에 선언된 기명함수는 함수선언이 아니라 함수 리터럴로 평가 된다는 이야기이다.

그렇기때문에 함수 이름은 함수 몸체에서만 참조할 수 있는 식별자이므로 즉시 실행 함수를 다시 호출할 수는 없다.

즉시 실행 함수는 반드시 그룹 연산자()로 감싸야한다.

그렇지않으면 다음과 같이 에러가 발생한다.

function(){ // SyntaxError :Function statements require a fuction name

}();

위 예제에서 에러가 발생하는 이유는 무엇일까?

이유는 함수 정의가 함수 선언문의 형식에 맞지 않기 때문이다.

함수 선언문은 함수 이름을 생략할 수 없다.

기명 함수를 정의해 그룹 연산자 없이 즉시 호출하면 어떻게 될까?

function foo(){
  // ...
}(); SyntaxError: Unexpected token ')'

위 예제에서도 에러가 발생한다.

그 이유는 자바스크립트 엔진이 암묵적으로 수행하는 세미클론 자동 삽입 기능에 의해 함수 선언문이 끝나는 위치, 즉 함수 코드 블록의 닫는 중괄호 뒤에 ";"이 암묵적으로 추가되기 때문이다.

이렇게 말하면 무슨 소린지 모르겠다. 그래서 풀어서 해석해보자.

function foo(){}(); 이녀석이 // => 이렇게 판정된다. function foo(){}; ();

따라서 함수 선언문 뒤의()는 함수 호출 연산자가 아니라 그룹 연산자로 해석된다.

그룹 연산자에 피연산자가 없기 때문에 에러가 발생한다.

즉시실행 함수의 값 , 인수전달

즉시 실행 함수도 일반 함수처럼 값을 반환할 수 있고 인수를 전달할 수도 있다.

<script>
 var res = (function(){
 var a =3;
 var b =5;
 return a * b;
 }());
 
 console.log(res); //15
 
 res = (function(a,b){
 return a * b;
 }(3,5));
 
  console.log(res); //15

</script>

코드로 확인할 수 있듯이 즉시 실행함수도 인수와 값을 반환할 수 있다.

재귀함수

함수가 자기 자신을 호출하는 것을 재귀 호출이라 한다.

재귀함수는 자기 자신을 호출하는 행위, 즉 재귀 호출을 수행하는 함수를 말한다.

재귀 함수는 반복되는 처리를 위해 사용한다.

예를 들어 10부터 0까지 차례대로 하행해 콘솔에 출력하는 함수를 만들어보자.

<script>
   function countDown(n) {
        if (n < 0) return;

        console.log(n);
        countDown(n - 1);
      }
      countDown(10)
</script>

이러럼 자기 자신을 호출하는 재귀 함수를 사용하면 반복되는 처리를

반복문 없이 구현할 수 있다.

재귀 함수는 자신을 무한 재귀 호출한다.

따라서 재귀 함수 내에는 재귀 호출을 멈출 수 있는 탈출 조건을 반드시 만들어야한다.

순수함수와 비순수 함수

순수함수는 동일한 인수가 전달되면 언제나 동일한 값을 반환하는 함수이다.

즉 어떤 외부상태에도 의존하지 않고 오직 매개변수를 통해 함수 내부로 전달된

인수에게만 의존해 값을 생성하고 반환한다.

<script>
  function pure(a, b) {
        return a + b;
      }
      console.log(pure(2, 2)); // 4
</script>

위코드는 순수함수의 예제 코드이다.

비순수 함수의 코드도 확인해보자.

<script>
   let count = 0;
      function notPure(a, b) {
        count++;
        return a + b + count;
      }
      console.log(notPure(2, 2)); //5
      console.log(notPure(2, 2)); //6
</script>

notPure가 호출되면 전역변수 count = 0를 1씩 더하기때문에 호출할때마다

값이 바뀌게 된다. 외부의 상태에 반응해 반환값이 달라지는 함수를 비순수 함수라고 표현한다.

함수가 외부 상태를 변경하면 상태 변화를 추적하기 어려워진다.

따라서 함수 외부상태의 변경을 지양하는 순수 함수를 사용하는 것이 좋다.

오늘은 여러가지 함수에 대해 공부했고 콜백의 부분은 다양한 메서드들을 공부하면서 익혀보자 .

0개의 댓글