12.5 ~
함수에 필요한 값을 매개변수 (parameter)를 통해 인수를 전달한다.
매개변수는 함수를 정의할 때 선언한다.
함수가 호출되면 함수 몸체 내에서 임의적으로 생성되고, undefined가 할당된다.
함수의 매개변수를 할당하지 않아도 에러는 생기지 않는다.
초과되는 매개변수는 무시된다. 하지만, 없어지는 것이 아닌 arguments 객체의 프로퍼티로 보관된다.
function a(a, b) {
console.log(arguments); // [2,5,10 ...]
}
a(2, 5, 10);
function a(a = 0, b = 0) {}
매개변수는 순서를 지켜야 하지만, 객체 형태로 넘기게 된다면 key를 통해 보내줄 수 있기 때문에, 실수도 줄고 가독성도 높아진다.
이상적인 함수는 한가지 일만 해야 하며, 가급적 작은 구조가 좋다.
함수 호출은 '표현식'이다.
반환문은 함수의 실행을 중단하고 함수 몸체를 빠져나간다.
반환문은 함수 몸체 내부에서만 사용 가능하다.
원시값은 값 자체가 복사되어 전달되고, 객체는 참조 값이 복사되어 전달된다.
ex) 원시 타입과, 객체 타입을 전달을 받아, 함수에서 변경하는 함수가 있다.
function fun(a, b) {
a = 4;
b.name = "hi";
}
let c = { name: "hong" };
let d = 5;
fun(c, d);
c; // name: "hi";
d; // 5;
원시 값은 변경 불가능한 값이기 때문에 재할당을 통해 할당된 원시 값을 새로운 값으로 교체했다.
이 때, 원시 타입인수는 값 자체가 복사되어 전달되기 때문에, 함수 몸체에서 변경해도 원본이 훼손되지 않는다.
객체 타입 인수는 변경 가능한 값으로 재할당 없이 직접 할당된 객체를 변경할 수 있다.
객체 타입은 참조 값이 복사되어 매개변수에 전달되기 때문에, 원본이 훼손된다.
함수 외부에서 내부로 전달한 참조 값에 의해 원본 객체가 변경된다.
이렇게 변경이 되게 되면, 객체의 변경을 추적하기 어렵기 때문에, 불변 객체로 만들어서 사용하는 것을 권장한다.
함수를 정의함과 동시에 실행한다. 한번만 호출되며, 다시 호출할 수 없다.
(function(){}())
함수가 자기 자신을 부르는 것을 재귀 호출이라고 한다.
함수 내부에 정의된 함수를 중첩 함수 혹은 내부 함수라고 한다.
매개변수를 통해 다른 함수의 내부로 함수를 전달해 사용하는 함수
콜백 함수 : 내부로 전달되는 함수
고차 함수 : 매개변수를 통해 함수의 외부에서 콜백 함수를 전달받은 함수 (주체)
고차 함수는 매개변수를 통해 전달받은 콜백 함수의 호출 시점을 결정해서 호출한다.
외부 상태에 의존하지 않고, 변경하지도 않는 (부수효과가 없는) 함수.
동일한 인수에 언제나 동일한 값을 반환한다.
함수형 프로그래밍이나, 객체지향 프로그래밍에서는 순수 함수를 지향해 프로그램의 안정성을 높이려고 한다.