[12장] 함수(2)

ssu00·2022년 1월 8일
0

12.6 참조에 의한 전달과 외부 상태의 변경

function changeVal(primitive, obj){
    primitive += 100;
    obj.name = 'Kim';
}

var num = 100;
var person = {name: 'Lee'};

console.log(num, person); //100 {name: 'Lee'}
changeVal(num, person);
console.log(num, person); //100 {name: 'Kim'}

매개변수 primitive의 경우, 원시값이므로 변경이 불가능하다. 재할당을 통해 원시값을 교체해야 하므로, changeVal 함수를 호출한 후에도 num 값이 100이다.

매개변수 obj의 경우, 객체이므로 변경 가능하다. 재할당 없이 직접 할당된 객체를 변경해야 하므로, changeVal 함수를 호출한 후에는 person의 name 값이 Kim이다.

obj의 경우처럼 함수가 외부 상태를 변경하면, 상태 변화를 추적하기 어려워진다. 이 문제의 해결방법은 객체를 불변 객체로 만들어 사용하는 것이다. 불변 객체에 대해서는 16절에서 자세히 알아보도록 하겠다.

12.7 다양한 함수의 형태

1) 즉시 실행 함수
함수 정의와 동시에 즉시 호출되는 함수이다. 단 한 번만 호출되며, 다시 호출할 수 없다.

var res = (function(){
   var a = 3;
   var b = 5;
   return a * b;
}()); //일반 함수처럼 값을 반환할 수 있다. 
console.log(res); //15

res = (function(a, b){
   return a * b;
}(3, 5)); //일반 함수처럼 인수를 전달할 수 있다. 
console.log(res); //15

즉시 실행 함수는 반드시 그룹 연산자 ()로 감싸야 한다. 그렇지 않으면 에러가 발생한다.

2) 재귀 함수
자기 자신을 호출하는 함수를 재귀 함수라고 한다.

var factorial = function foo(n){
  if(n <= 1) return 1;
  return n * factorial(n-1);
  //return n * foo(n-1);도 사용 가능
}
console.log(factorial(5));

함수 몸체 내부에서는 foo와 같은 함수 이름을 이용해 자기 자신을 호출할 수 있지만, 함수 외부에서는 반드시 함수를 가리키는 식별자(factorial)로 호출해야 한다.

3) 중첩 함수
함수 내부에 정의된 함수를 중첩 함수 또는 내부 함수라고 한다. 중첩 함수는 자신을 포함하는 외부 함수를 돕는 헬퍼 함수의 역할을 한다.

4) 콜백 함수
함수의 매개변수를 통해 다른 함수의 내부로 전달되는 함수콜백 함수라고 한다.
매개변수를 통해 함수의 외부에서 콜백 함수를 전달받은 함수고차 함수라고 한다.

5) 순수 함수와 비순수 함수
어떤 외부 상태에 의존하지도 않고 변경하지도 않는 함수를 순수 함수라고 한다. 순수 함수는 오직 매개변수를 통해 함수 내부로 전달된 인수에게만 의존해 반환값을 만든다.
외부 상태에 의존하거나 외부 상태를 변경하는 함수를 비순수 함수라고 한다.

//순수 함수
var count = 0;
function increase(n){
	return ++n; //인수 n에 의존해 반환값을 만든다. 
}
count = increase(count);
console.log(count); //1
//비순수 함수
var count = 0;
function increase(){
	return ++count; //외부 상태 count에 의존해 count를 변경한다.
}
increase();
console.log(count); //1

되도록이면 함수 외부 상태의 변경을 지양하는 순수 함수를 사용하는 것이 좋다.

함수형 프로그래밍은 순수 함수와 보조 함수의 조합을 통해 외부 상태를 변경하는 부수 효과를 최소화해서 불변성을 지향하는 프로그래밍 패러다임이다.

0개의 댓글