함수의 선언

자바스크립트 엔진은 생성된 함수를 호출하기 위해 함수 이름과 동일한 식별자를 암묵적으로 생성하고, 거기에 함수 객체를 할당하는 구조

즉, 함수는 함수 이름으로 호출하는 것이 아니라 함수 객체를 가리키는 식별자로 호출함

function hello(name) {
    return `${name}님 안녕하세요!`;
}
// 위의 함수를 생성하기 위해 동일한 식별자를 생성
var hello = function hello(name) {
     return `${name}님 안녕하세요!`;
 };

함수 표현식

자바스크립트의 함수는 객체 타입의 값으로 값의 성질을 갖는 객체를 일급 객체라고 함

함수는 일급 객체 이므로 함수 리터럴로 생성한 함수 객체를 변수에 할당할 수 있다.

var hello = function (name){
    return `${name}님 안녕하세요!`;
};

console.log(hello('홍길동'));

var calc = function add(a, b){
    return a + b;
};

/* 함수 호출은 식별자로만 이루어진다. */
console.log(calc(10, 20));

/* 함수명으로는 호출이 불가능하다. */
console.log(add(10, 20));

함수 호이스팅(function hoisting)

함수 선언문은 런타임 이전 자바스크립트 엔진에 의해 먼저 실행된다.

따라서 함수 선언문 이전에 함수를 참조할 수 있으며 호출할 수 도 있다.

함수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징을 함수 호이스팅이라고 한다.

console.log(hello('반갑소'));  // 실행 가능
console.log(hi);  // undefined

/* 함수 선언문(먼저 해석됨, 반드시 함수 이름을 달아야 함(익명함수로는 안됨)) */
function hello(name) {
    return `${name}님 안녕하세요!`;
}

/* 함수 표현식 */
var hi = function(name) {
    return `${name} 안녕~`;
};