일련의 과정을 문(statement)으로 구현하고 코드 블록으로 감싸 하나의 실행 단위로 정의한 것
함수는 함수 이름으로 호출하는 것이 아니라 함수 객체를 가리키는 식별자로 호출 한다 즉, 함수 객체의 메모리 주소값을 가지고 있는 식별자로 함수를 호출한다
let 식별자 = fuction 함수이름(x, y) {
retrun x + y;
}
console.log(식별자(2, 5));
// 예시
let add = fuction add(x, y) {
retrun x + y;
}
console.log(add(2, 5));
이해하기 모호할 수 있는 내용인데 호출을 할 때 함수 add를 불러오는 것 이아니라
함수 add의 메모리 주소값을 가지고있는 식별자 add를 호출해 함수를 호출하는 것임
일급 객체인 함수를 변수에 할당하는 것을 함수 표현식이라 함
값은 변수에 할당 할 수 있고, 프로퍼티 값이 되며, 배열의 요소도 된다.
값의 성징를 갖는 객체를 일급 객체라 하는데 객체인 함수도 값의 특성을 가지고 있으므로 일급 객체이다.
함수 호이스팅은 함수 선언문에서 발생
함수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 JS 고유의 특징을 함수 호이스팅이라 한다.
함수 표현식은 변수에 할당하는 구조이므로 var
키워드를 써서 함수를 할당하면
함수 선언문과는 다르게 변수 호이스팅이 발생함
일반적이지 않으며 바람직하지 않은 함수 생성 방법
클로저를 생성하지않고, 일반적인 함수 선언문이나 표현식으로 생성한 함수와 다르게 동작한다.
=> 를 사용해 좀 더 간략한 방법으로 함수 선언, 내부 동작 또한 간략화 되어있다.
선언문과 표현식 함수를 대체하지 못하는 이유
함수 선언할 때 정의하는 것 - 매개변수
함수 호출할 때 전달하는 값 - 인수
JS 함수는 매개변수와 인수의 개수가 일치하는지 확인하지 않고
매개변수의 타입을 사전에 지정할 수 없으므로
필요에 따라 조건문으로 적절한 인수가 전달되었는지 확인할 필요가 있다
ECMAScript 사양에서는 매개변수의 최대 개수에 대한 제한은 없음
함수에서 많은 매개변수는 유지보수성을 나쁘게 만드므로
이상적은 매개변수는 0개 그리고 최대 3개를 넘지 않도록 작성하는 것이 좋음
함수의 실행결과를 반환문으로 함수 외부로 반환할 수 있음
명시적으로 반환값을 지정해주지 않으면 함수는 undefined
를 반환함
인수로 원시 값이 아니라 참조 값을 전달 받을 경우
함수가 참조 값을 영향을 끼치는 경우 객체의 원본을 훼손할 수 있다.
단 한번만 호출되며 다시 호출 할 수 없음
반드시 (...) 그룹 연산자로 감싸야한다.
(fuction () {
let a = 3;
let b = 5;
return a * b;
}());
자기 자신을 호출하는 형태의 함수
반복문 없이 반복처리할 수 있다는 장점이 있지만
스택 오버플로 에러를 발생할 수 있기 때문에 주의해서 사용해야함
함수 내부에 정의된 함수
함수가 정의된 스코프에서만 호출할 수 있다
스코프 밖에서 중첩 함수를 호출하는 것은 불가능함
함수의 매개변수를 통해 다른 함수의 내부로 전달되는 함수
고차함수에 함수의 리턴값을 전달하는 것이 아니라 함수 자체가 전달 됨
매개변수를 통해 함수의 외부에서 콜백 함수를 전달받은 함수는 고차함수라고 한다.
즉, 함수를 인수로 전달받는 함수를 고차함수라고 한다.
순수함수 - 외부 상태에 의존하지 않고 외부 상태를 변경하지 않는, 부수 효과 없는 함수
비순수 함수 - 외부 상태에 의존하거나, 외부 상태를 변경하는 부수 효과가 있는 함수