함수 정의식에 작성된 인자 개수보다 인수를 적게 전달해서 함수를 실행하면 인수에서 생략한 인자는 undefind가 된다. 이러한 성질을 활용하면 호출할 때 인수를 생략할 수 있는 함수를 정의할 수 있다. 이를 구현하려면 함수 정의식에서 인수를 생략 했을때 사용할 초깃값을 설정 해줘야 한다.
function f(x,y) {
console.log(X, Y)
}
f(2) // x = 2, y = undefined
function f(x,y) {
y = y || 1;
console.log(X, Y)
}
f(2) // x = 2, y = 1
논리연산자인 ||는 왼쪽 피연산자가 true로 평가되면 왼쪽 피연산자를 반환한다. 반대로 false로 평가되면 오른쪽 피연산자를 반환한다.
모든 함수에서 사용할 수 있는 지역변수로는 arguments 변수가 있다. 이 변수 값은 Arguments 객체이다. 이 객체는 프로퍼티로 length와 callee을 갖고 있으며 각 프로퍼티에는 다음과 같은 값이 담겨져 있다.
이 객체는 유사 배열 객체이다. 만약 arguments[i]의 값을 바꾸면 함수의 인자의 값이 바뀌게 된다. 일반적이 배열에는 이러한 성질이 없다. 이 변수를 활용하면 인수 개수가 일정하지 않은 가변 인수 함수를 정의할 수 있다.
function myF(string) {
let s = "";
for(let i = 1; i < arguments.length; i++){
s += arguments[i]
}
}
이 객체는 유사 배열 객체이나, 다음 아래의 방법을 사용한다면 배열 객체로 변환 할 수 있다.
let params = [].slice.call(arguments);
arguments.callee을 이용하면 이름 없는 이멱 함수 또한 재귀 호출 할 수 있다. 왜냐하면 callee가 지금 실행 중인 함수를 가리키기 때문이다.