함수는 자바스크립트에서 가장 중요한 핵심 개념이다.
함수를 사용하는이유는 동일한 작업을 반복적으로 수행할때 코드를 중복해서 여러번 작성하는것이 아니라 미리 정의된 함수를 재사용하는 것이 효율적이다. 함수는 몇 번이든 호출할 수 있으므로 코드의 재사용이라는 측면에서 매우 유용하다.
코드의 중복을 억제하고 재사용성을 높이는 함수는 유지보수의 편의성을 높이고 실수를 줄여 코드의 신뢰성을 높이는 효과가 있다.
함수 이름은 변수이름과 마찬가지로 함수 자신의 역활을 잘성명해야한다. 적절한 함수 이름은 내부 코드를 이해하지 않고도 함수의 역활을 파악할 수 있게 돕는다. 이는 코드의 가독성을 향상시킨다.
함수 리터럴
var f = function add(x, y) {
return x + y;
};
위의 소스에서 볼수있다시피 함수를 변수에 할당하고 있다.
함수는 객체다.
함수는 객체지만 일반함수와 다르게 고유한 프로퍼티를 가지고있다.
이특징을 제대로 이해하지않으면 함수를 제대로 이해하기 어렵다.
함수 선언문
function add(x, y) {
return x + y;
}
// console.dir은 console.log와 달리 함수 객체의 프로퍼티까지 출력한다.
function (x, y) {
return x + y;
}
// syntaxerror ---> 함수 선언문은 이름을 생략할수없다.
function add( x, y) {
return x + y;
}
// undefined --> 함수 선언문은 표현식이 아닌 문이다.
함수선언문은 함수이름을 생략할수 없다.
함수선언문은 표현식이 아닌 문이다.
함수 표현식
// 기명 함수 표현식
var add = function foo (x, y) {
return x + y;
};
console.log( add(2,5) ); //7
console.log( foo(2,5) ); // foo is not defined
자바스크립트 엔진은 함수선언문은 표현을하는 문이라 생각, 함수몸체 내부에서만 유효한 식별자이다.
함수 객체를 가리키는 식별자를 사용할때 , 즉 표현식을 사용할때 함수를 호출할수있다.
함수 생성 시점과 함수 호이스팅
// 함수 참조
console.dir(add);
console.dir(sub);
// 함수 호출
console.log(add(2, 5));
console.log(sub(2, 5));
// 함수 선언문
function add(x, y) {
return x + y;
}
// 함수 표현식
var sub = function (x, y) {
return x - y;
};
함수 선언문으로 정의한 함수는 선언문 이전에 호출할수있다.
함수 표현식으로 정의한 함수는 선언문 이전에 호출할수없다.
이는 함수 선언문으로 정의한 함수와 함수 표현식으로 정의한 함수의 생성 시점이 다르기 때문이다.
함수 선언문으로 함수를 정의하면 런타임 이전에 함수 객체가 먼저 생성된다. 그리고 자바스크립트 엔진은 함수 이름과 동일한 이름의 식별자를 암묵적으로 생성하고 생성된 함수 객체를 할당한다.
즉, 코드가 한줄씩 순차적으로 실행되기 시작하는 런타임에서는 이미 함수객체가 생성되어있고 함수 이름과 동일한 식별자에 할당까지 완료된 상태이다.
이처럼 함수 선언문이 코드의 선두로 끌어 올려진것처럼 동작하는 자바스크립트 고유의 특징을 함수 호이스팅이라 한다.
함수 호이스팅은 함수가 호출하기 전에 반드시 함수를 선언해야 한다는 당연한 규칙을 무시한다.
이같은 문제 때문에 JSON을 창안한 더글라스 크락포드는 함수 선언문 대신 함수 표현식을 사용할 것을 권장한다.
나머지 Function 함수와 화살표함수는 나중에 다뤄보자한다.
인수 확인
function add(x, y) {
if (typeof x !== "number" || typeof y !== "number") {
throw new TypeError("인수는 모두 숫자 값이여야 합니다.");
}
return x + y;
}
console.log(add(2));
console.log(add("a", "b"));
이처럼 함수 내부에서 적절한 인수가 전달되었는지 확인하더라도 에러는 런타임에 발생하게 된다.
따라서 타입스크립트와 같은 정적타입을 선언해서 컴파일시점에 부적절한 호출을 방지할 수 있게하는것도 하나의 방법이다.
매개변수의 최대 개수
이상적인 함수는 한가지 일만 해야하며 가급적 작게만들어야한다.
따라서 매개변수는 최대 3개 이상을 넘지 않는것을 권장한다.