함수 리터럴 : function 키워드, 함수 이름, 매개변수 목록, 함수 몸체
// 함수 리터럴= 함수 값을 생성해주기 때문에 변수에 할당 가능
const sumf = function sum(a,b){
return a+b;
}
function add(x,y){
return x+y;
}
함수 리터럴과 형태가 같은데 함수 리터럴은 변수에 할당이 되는 이유 ?
자바스크립트 엔진이 코드 문맥에 따라 함수 리터럴을 단독으로 사용하면 함수 선언문으로 해석하고 피연산자로 사용하면 함수 리터럴 표현식으로 해석하기 때문
const add = function(x,y){
return x+y;
}
함수 선언문과 함수 표현식의 차이점 : 함수의 생성 시점이 다르다
함수 선언문은 런타임 이전에 함수 객체가 생성이 완료 되지만
함수 표현식은 변수에 함수 리터럴을 할당했기 때문에 변수가 먼저 호이스팅되고 런타임 때 함수 리터럴이 평가되어 함수 객체가 생성되어 할당됨
함수 선언문을 사용하면 함수 호이스팅 때문에 선언 이전에 호출이 가능한데
이는 이상한 것이기 때문에 함수 표현식을 사용하는 것을 권장
클로저를 생성하지 않아 함수 선언문, 함수 표현식과는 다르게 동작함
const add = (function(){
const x = 10;
return new Function('a','b','return x+a+b;');
}());
add(1,2); // Uncaught ReferenceError: x is not defined
매개변수는 함수 내부에서 변수와 동일하게 취급
함수 호출 시 매개변수가 생성되고 undefined로 초기화 된 후 인수가 할당됨
인수들은 arguments 객체의 프로퍼티로 보관됨
함수를 정의할 때 생각한대로 인수가 전달이 안되면 에러 발생
단축평가나 매개변수 기본값을 설정하여 에러를 피한다
// 숫자 + undefined = NaN 피하기
function sum(a,b){
a = a || 0;
b = b || 0;
return a+b;
}
function sum(a=0,b=0){
return a+b;
}
이상적인 매개변수의 개수는 0개
함수는 한가지 일만 하도록 가장 적게 정의해야함
함수 호출은 표현식이다
반환문 생략시 return undefined
인수로 원시 타입을 전달하면 원본이 변경되지 않지만
인수로 객체를 전달해서 함수 내부에서 조작하면 원본이 변경됨
(function(){
...
}());
스택 오버플로 에러를 발생시킬 수 있으므로 주의
함수 내부에 정의된 함수, = 내부함수
중첩 함수는 자신이 정의된 외부 함수 내부에서만 호출 가능
콜백 함수가 고차 함수 내부에서만 호출된다면 익명 함수 리터럴로 정의하는게 일반적인 방법
but 고차 함수가 호출될 때마다 콜백 함수로 전달한 리터럴이 평가되어 함수 객체를 생성하기 때문에 고차 함수가 반복적으로 호출되면 콜백 함수를 따로 정의해서 식별자를 인수로 전달하는 것이 효율적
순수 함수 : 외부의 상태에 의존하지 않고, 외부의 상태를 변경하지도 않는 함수
비순수 함수 : 외부 상태에 의존하고, 외부 상태를 변경시키는 함수
함수형 프로그래밍