ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Modern JavaScript 함수
    FrontEnd/JavaScript 2023. 1. 21. 18:44

     


    1. 함수 

    •  함수란 : 작업 수행을 위해 필요한 statement 집합을 정의한 코드 블록

            - 매개변수를 가지며 호출로 일괄 작업 가능

            - 재사용측면에서 유용

     

    • 함수 정의 방식 : 함수 표현식과 함수 선언문에서 사용한 함수명은 함수 몸체에서 자신을 재귀적 호출(Recursive function call)하거나 자바스크립트 디버거가 해당 함수를 구분할 수 있는 식별자의 역할을 한다.

     


     

    2. 함수 선언문

    • 함수 표현식

           - 기명 함수 표현식(named function expression)

               var foo = function multiply(a, b) {

                   return a * b;

                };

     

           - 익명 함수 표현식(anonymous function expression)

              var bar = function(a, b) {

                 return a * b;

              };

     

           - Function 생성자 함수 : Function.prototype.constructor 프로퍼티로 접근

              var square = new Function('number', 'return number * number');

              console.log(square(10));              // 100

     

    • 일급 객체 : 기본적 조작을 제한없이 사용

            - 무명의 리터럴로 표현이 가능하다.

            - 변수나 자료 구조에 저장할 수 있다.

     

            var increase = function (num) {

                      return ++num;

             };

     

           var decrease = function (num) {

                      return --num;

           };

     

           var predicates = { increase, decrease };

     

          - 함수의 매개변수에 전달할 수 있다.

          - 반환값으로 사용할 수 있다.

           function makeCounter(predicate) {

                     var num = 0;

              return function () {

                          num = predicate(num);

                          return num;

               };

            }

     


    3. 매개변수(parameter) / 인수(argument)

    • 매개변수 : 함수내에서 변수와 동일하게 메모리공간을 확보
    • 인수 : 함수에 전달되며 매개변수에 할당됨

     

    • 인수를 전달하지 않으면 매개변수는 undifined로 초기화됨

             - 매개변수

                var foo = function (p1, p2) {

                       console.log(p1, p2);

                };

     

              - 인수

                foo(1); // 1 undefined

     

     


     

    4. Call-by-value / Call-by-reference

     

     

    • Call-by-value :  원시타입 인수는 값에 의해 호출됨 
    function foo(primitive) {
      primitive += 1;
      return primitive;
    }
    
    var x = 0;
    
    console.log(foo(x)); // 1
    console.log(x);      // 0
    

     

    • Call-by-reference : 참조에 의한 호출
    function changeVal(primitive, obj) {
      primitive += 100;
      obj.name = 'Kim';
      obj.gender = 'female';
    }
    
    var num = 100;
    var obj = {
      name: 'Lee',
      gender: 'male'
    };
    
    console.log(num); // 100
    console.log(obj); // Object {name: 'Lee', gender: 'male'}
    
    changeVal(num, obj);
    
    console.log(num); // 100
    console.log(obj); // Object {name: 'Kim', gender: 'female'}

     

    • 반환값 (return):  함수를 호출한 코드(caller)에게 값을 반환할 때 사용

     


     

    5. 함수의 다양한 형태 

     

    • 즉시 실행 함수 (IIFE, Immediately Invoke Function Expression) :  다시 호출할 수 없다. (최초 한번만 실행이 필요한 초기화 처리등에 사용)
    // 기명 즉시 실행 함수(named immediately-invoked function expression)
    (function myFunction() {
      var a = 3;
      var b = 5;
      return a * b;
    }());
    
    // 익명 즉시 실행 함수(immediately-invoked function expression)
    (function () {
      var a = 3;
      var b = 5;
      return a * b;
    }());
    
    // SyntaxError: Unexpected token (
    // 함수선언문은 자바스크립트 엔진에 의해 함수 몸체를 닫는 중괄호 뒤에 ;가 자동 추가된다.
    function () {
      // ...
    }(); // => };();
    
    // 따라서 즉시 실행 함수는 소괄호로 감싸준다.
    (function () {
      // ...
    }());
    
    (function () {
      // ...
    })();
    

     

    • 내부 함수 (Inner function) : 함수 내부에 정의된 함수

           - 부모함수는 자식함수 (내부함수)에 접근할 수 없다. 

           - 내부함수는 부모함수의 외부에 접근할 수 없다.

     

    function parent(param) {
      var parentVar = param;
      function child() {
        var childVar = 'lee';
        console.log(parentVar + ' ' + childVar); // Hello lee
      }
      child();
      console.log(parentVar + ' ' + childVar);
      // Uncaught ReferenceError: childVar is not defined
    }
    parent('Hello');
    

     

    • 재귀함수 (Recusive function): 자기 자신을 호출하는 함수  

           - 재귀 함수는 자신을 무한히 연쇄 호출하므로 호출을 멈출 수 있는 탈출 조건을 반드시 있어야함 (stackoverflow error)

    // 피보나치 수열
    // 피보나치 수는 0과 1로 시작하며, 다음 피보나치 수는 바로 앞의 두 피보나치 수의 합이 된다.
    // 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, ...
    function fibonacci(n) {
      if (n < 2) return n;
      return fibonacci(n - 1) + fibonacci(n - 2);
    }
    
    console.log(fibonacci(0)); // 0
    console.log(fibonacci(1)); // 1
    console.log(fibonacci(2)); // 1
    console.log(fibonacci(3)); // 2
    console.log(fibonacci(4)); // 3
    console.log(fibonacci(5)); // 5
    console.log(fibonacci(6)); // 8
    
    // 팩토리얼
    // 팩토리얼(계승)은 1부터 자신까지의 모든 양의 정수의 곱이다.
    // n! = 1 * 2 * ... * (n-1) * n
    function factorial(n) {
      if (n < 2) return 1;
      return factorial(n - 1) * n;
    }
    
    console.log(factorial(0)); // 1
    console.log(factorial(1)); // 1
    console.log(factorial(2)); // 2
    console.log(factorial(3)); // 6
    console.log(factorial(4)); // 24
    console.log(factorial(5)); // 120
    console.log(factorial(6)); // 720
    

     

    • 콜백함수 (Callback function) : 호출방식이 아닌, 특정시점에 이벤트 발생시 시스템에 의해 호출 (ex. event handler 처리)

     

    콜백 함수 호출

    - 비동기식 처리모델(Asynchronous processing model)에 사용 : 처리 종료시 호출될 함수(콜백함수)를 미리 매개변수에 전하고 종료시 콜백함수 호출

    - que에 들어있다가 이벤트 발생시 호출 : 클로저로 큐 단독으로 존재하다가 호출되어도 전달받은 함수의 변수에 접근 가능

     

    function doSomething() {
      var name = 'Lee';
    
      setTimeout(function () {
        console.log('My name is ' + name);
      }, 100);
    }
    
    doSomething(); // My name is Lee
    
     

    'FrontEnd > JavaScript' 카테고리의 다른 글

    Modern JavaScript 타입체크  (0) 2023.01.22
    Modern JavaScript 객체의 프로퍼티  (0) 2023.01.21
    Modern JavaScript 객체  (0) 2023.01.21
    Modern JavaScript 연산과 제어  (0) 2023.01.15
    Modern JavaScript 데이터타입과 변수  (0) 2023.01.09

    댓글

Designed by Tistory.