TIL05 | 함수와 함수 호이스팅

2021. 9. 30. 14:55언어/Javascript

반응형

모던 자바스크립트(저자 이웅모) 내용을 참고하였습니다.

 

함수

일련의 과정을 문(statement)으로 구현하고 코드블록으로 감싸서 하나의 실행 단위로 정의한 것이다.

 

함수 정의

함수는 함수 정의를 통해 생성한다.

함수 정의란 함수를 호출하기 이전에 인수를 전달받을 매개변수와 실행할 문들, 그리고 반환할 값을 지정하는 것을 말한다.

함수를 정의하는 방법

  1. 함수 선언문

    funtion add(x, y){
        return x + y; 
    }
  2. 함수 표현식

    var add = funtion (x, y){    
        return x + y; 
    };
  3. 화살표 함수(ES6)

    var add = (x, y) => x + y;
  4. Function 생성자 함수

    var add = new Function('x','y', 'return x+y');

  

함수 호출

함수 실행은 인수를 매개변수를 통해 함수에 전달하면서 함수의 실행을 명시적으로 지시해야한다. 이를 함수 호출(function call/invoke)이라 한다.

함수를 호출하면 코드 블록에 담긴 문들이 일괄적으로 실행되고, 반환값을 반환한다.

// 함수 정의
funtion add(x, y){
    return x + y; 
}

// 함수 호출
var result = add(2, 5); 

console.log(result); // 7

 

함수를 사용하는 이유

"코드의 재사용"

함수는 필요할 때 여러 번 호출할 수 있다.

동일한 작업을 반복적으로 수행해야 한다면, 미리 정의된 함수를 재사용하는 것이 효율적이다.

코드의 중복을 억제하고 재사용성을 높이는 함수는 유지보수의 편의성을 높이고 실수를 줄여 코드의 신뢰성을 높이는 효과가 있다.

 

📌️ 함수 생성 시점과 함수 호이스팅

함수 선언문으로 정의한 함수는 함수 선언문 이전에 호출할 수 있다. 그러나 함수 표현식으로 정의한 함수는 함수 표현식 이전에 호출할 수 없다. 이는 선언문과 표현식의 함수 생성 시점이 다르기 때문이다.

함수 선언문으로 함수를 정의 할 때

  1. 런타임 이전에 함수 객체가 먼저 생성된다.

  2. 자바스크립트 엔진은 함수 이름과 동일한 이름의 식별자를 암묵적으로 생성하고 생성된 함수 객체를 할당한다.

런타임에는 이미 함수 객체가 생성되어 있고, 함수 이름과 동일한 식별자에 할당까지 완료된 상태다. 따라서 함수 선언문 이전에 함수를 참조할 수 있으며 호출할 수 있다 👉️ 함수 호이스팅

함수 표현식으로 함수를 정의 할 때

함수 표현식은 변수에 할당되는 값이 함수 리터럴인 문이다. 따라서 함수 표현식은 변수 선언문과 변수 할당문을 한 번에 기술한 축약 표현과 동일하게 작용한다.

변수 할당문의 값은 할당문이 실행되는 시점. 즉, 런타임에 평가되므로 함수 표현식의 함수 리터럴도 할당문이 실행되는 시점에 평가되어 함수 객체가 된다 👉️ 변수 호이스팅

함수 호이스팅은 함수를 호출하기 전에 반드시 함수를 선언해야 한다는 당연한 규칙이 무시된다.

따라서 함수 선언문 대신 함수 표현식을 사용하자.

 

반응형