일련의 과정을 문으로 구현하고 코드블록으로 감싸서 하나의 실행단위로 정의한 것.
코드 재 사용성, 유지보수 편의성, 코드 신뢰성을 높일 수 있음. 실행 시점 결정 가능.
function add(x,y) {
return x + y;
}
add(2,5); // 7
미리 정의된 일련의 과정을 실행하기 위해 필요한 입력(인수)를 매개변수를 통해 함수에 전달하면서 함수의 실행 명시적으로 지시하는 것. 실행 결과 반환 값 반환함.
var result =add(2, 5);
console.log(result); // 7
함수 리터럴이 평가되어 함수 객체를 생성. 즉, 함수는 객체. 함수는 호출 가능 (일반 객체는 호출 불가)
var f = function add(x,y){
return x + y;
}
정의된 함수는 자바스크립트 엔진에 의해 평가되어 함수 객체가 됨.
function add(x, y){
return x + y;
}
function foo(){ console.log('foo') }
foo(); // foo
함수 선언문으로 정의한 함수는 런타임 이전에 먼저 객체를 생성하고 함수 이름과 동일한 식별자를 암묵적으로 생성하고 생성된 함수 객체를 할당함. 즉, 함수 선언문 이전에 함수를 참조/호출 할 수 있음(함수 객체를 가리키는 식별자를 호출). 함수 선언문이 코드 선두로 끌어올려진 것처럼 동작하는 자바 스크립트 고유한 특징을 함수 호이스팅 이라고 함.
var add = function (x,y){
return x + y;
}
(function bar() { console.log('bar'); });
bar(); // ReferenceError: bar is not defined;
함수 표현식은 암묵적으로 식별자를 생성하지 않음. bar()로 호출 시 함수 이름을 호출하는 것으로 해석 되서, ReferenceError발생함.
함수 표현식은 변수 선언문과 변수 할당문을 한번에 기술한 축약 표현과 동일하게 동작.
변수 선언은 런타임 이전에 실행되어 undefined로 초기화되지만 변수 할당문의 값은 할당문이 실행되는 시점, 즉 런타임에 평가되므로 함수 표현식의 함수 리터럴도 할당문이 실행되는 시점에 평가되어 함수 객체가 됨. 변수 호이스팅이 발생함.
var add = new Function('x', 'y', 'return x + y');
console.log(add(2,5)); // 7
var add = (x,y) => x + y;
console.log(add(2,5)); // 7