프로그래밍 언어의 함수는 일련의 과정을 문으로 구현하고 코드 블록
으로 감싸서 하나의 실행 단위
로 정의한 것이다.
함수 정의
를 해줘야 한다. 인수
를 매개변수
로 전달하여 실행을 명시적으로 지시(함수 호출)해야 한다.함수를 통해 코드의 재사용성을 높일 수 있는데, 이를 통해
함수는 객체 타입의 값
이므로 변수
에 할당 가능하다. 따라서 함수 이름은 자신의 역학을 파악 할 수 있도록 잘 지어서 코드의 가독성을 향상시켜야 한다.
코드는 개발자의 문서이다. 가독성이 좋은 코드가 좋은 코드이다.
함수 = 객체
이지만 객체 != 함수
이다. 따라서 함수만 호출 가능하고, 함수만의 고유 프로퍼티도 가진다.
함수는 함수 리터럴로 생성할 수 있다. 구성요소는 function 키워드, 함수이름, 매개변수목록, 함수 몸체로 구성된다.
함수 이름
매개변수 목록
함수 몸체
함수를 정의하는 방법에는 4가지가 있다.
function add(x, y){
return x+y;
}
var add = function(x, y){
return x+y;
}
const add = new Function('x','y', 'return x+y');
Function 생성자 함수는 자바스크립트가 제공하는 기본 빌트인 함수이다. 생성자 함수이기 때문에 new와 함께 호출해야 하는데, Function 생성자 함수는 특별하게 내부적으로 new 연산자를 사용하여 객체를 생성 없이도 호출 가능하다..!
🔎 JavaScript에서의 일반적인 생성자 함수로는
Object()
,Array()
,String()
,Number()
,Boolean()
,Date()
,RegExp()
,Error()
,Function()
,Symbol()
,BigInt()
등이 있습니다.
더 특수한 목적을 가지거나 특정 환경에서만 사용되는 생성자 함수Map()
,Set()
,Promise()
,Proxy()
,Reflect()
등이 있습니다.
Function 생성자 함수의 첫번째 인수로는 매개변수 목록
, 두번째 인수로는 함수 몸체
를 문자열로 전달하면 함수 객체를 생성해서 반환한다.
cosnt add = (x,y) => return x+y;
화살표 함수는 ES6에서 도입된 간략한 방법하게 함수 선언을 할 수 있는 방법이다. 표현만 간단한것이 아니라 내부 동작 또한 간략화 되어 있다.
🔎 특징으로는 아래와 같다
- 항상 익명 함수로 정의한다.
- function 키워드 대신 화살표를 사용
- 생성자 함수로 사용할 수 없다.
- this 바인딩 방식이 다르다.
- prototype 프로퍼티가 없다.
- arguments 객체를 생성하지 않는다.
함수 호출은 식별자와 함수 호출 연산자(한 쌍의 소괄호)를 사용한다. 함수를 호출하면 현재의 실행 흐름을 중단하고 호출된 함수로 실행 흐름을 옮긴다.
매개변수는 함수를 정의할 때 선언하며, 몸체 내부에서 변수와 동일하게 취급된다. 따라서 undefined로 초기화 된후, 인수가 순서대로 할당된다.
만약 인수가 더 적으면
: 매개변수는 undefined
만약 인수가 더 많으면
: arguments 객체의 프로퍼티에 보관
//인수가 더 적을때
function sub(x,y){
console.log(y); //undefined
return x+y;
}
sub(3); //NaN
//인수가 더 많을때
function add(x,y){
console.log(arguments);
//Arguments(3) [2, 5, 10, callee: f, Symbol(Symbol.itertor):f]
return x+y;
}
add(2,5,10); //7
따라서 타입을 확인하여 코드의 신뢰성을 높이기 위한 방법이 몇가지 있다.
typeof로 직접 체크
function add(x,y) {
if(typeof x !== 'number' || typeof y !== 'number) {
throw new TypeError('인수는 모두 숫자 값이어야 합니다.');
}
return x+y;
}
이 방법의 경우 사전에 방지할수는 없고 런타임에 발생한다.
상위 확장
타입스크립트와 같은 정적 타입을 선언할 수 있는 자바스크립트의 상위 확장을 도입해서 컴파일 시점에 부적절한 호출을 방지할수 있다.
단축평가
function add(a,b,c){
a = a || 0;
b = b || 0;
c = c || 0;
return a+b+c;
}
ES6 매개변수 기본값 지정
function add(a = 0,b = 0,c = 0){
return a+b+c;
}
이는 인수가 전달되지 않았거나 undefined를 전달한 경우에만 유효하다.