함수 PART.2

정지훈·2020년 11월 28일
0

저번 블로그때에는 함수의 선언 방식과 함수 호이스팅에 대해서 설명했다.

함수는 여러가지 함수 형태가 있다.

즉시 실행 함수, 콜백 함수, 재귀함수, 중첩 함수가 있다.

즉시 실행 함수

즉시 실행 함수는 선언과 동시에 즉시 실행하는 함수이다.
보통 (function ())() 이런식으로 호출 연산자로 감싸는 형태를 띄운다.

이 함수는 전역 변수의 문제점을 해결 할 수 있다. 즉시 실행 되면 호출 하자마자 종료가 된다. 그러므로 무의미한 변수들의 생명주기가 짧다.

즉시실행함수는 그 함수 외부에서 다시는 호출이 불가능하다.
즉시 실행 함수는 즉시 호출이 되고 바로 종료하기 때문이다.

// 기명 즉시 실행 함수
(function foo() {
  var a = 3;
  var b = 5;
  return a * b;
}());

foo(); // ReferenceError: foo is not defined

재귀 호출

재귀호출은 자기 자신을 호출하는 것이다.

function foo(n) {
  if (n === 0) return;
  console.log(n)
  foo(n-1)
}
foo(10);

이렇게 자기 자신을 호출을 한다.

재귀호출은 반복문없이 구현 할 수 있는 방법중 하나이다.
그리고 만약 탈출조건이 없으면 계속 발생해서 무한 루프가 이뤄난다.

중첩 함수

함수 내부에 정의된 함수를 중첩 함수 또는 내부 함수라 한다. 그리고 중첩함수를 포함하는 함수는 외부 함수라고 하고 일반적으로 중첩함수는 자신을 포함하는 외부 함수를 돕는 헬퍼 함수의 역할을 한다.


function outer() {
	var x = 1;
  	
  	function inner() {
    	var y = 2;
      	console.log(x+y); // 3
    }
  inner();
}
outer();

이처럼 inner안에서 outer의 지역 변수인 x를 참조 할 수 있다.

나중에 스코프와 클로저에 깊은 관련이 있다.

콜백 함수

콜백 함수는 가장 중요하다.

콜백함수는 함수의 매개변수를 통해 다른 함수의 내부로 전달되는 함수를 콜백 함수라고 하며, 매개변수를 통해 함수의 외부에서 콜백함수를 전달받은 함수를 고차 함수라고 합니다.

이는 나중에 공부해야한 배열 고차 함수에 영향이 있습니다.

// 외부에서 전달받은 f를 n만큼 반복 호출한다
function repeat(n, f) {
  for (var i = 0; i < n; i++) {
    f(i); // i를 전달하면서 f를 호출
  }
}

var logAll = function (i) {
  console.log(i);
};

// 반복 호출할 함수를 인수로 전달한다.
repeat(5, logAll); // 0 1 2 3 4

var logOdds = function (i) {
  if (i % 2) console.log(i);
};

// 반복 호출할 함수를 인수로 전달한다.
repeat(5, logOdds); // 1 3

이런 식으로 함수를 매개변수로 다를 함수의 내부로 전달된다.

순수 함수와 비순수 함수

순수 함수와 비순수 함수가 있다.

이는 함수형 프로그래밍에서 외부 상태에 의존하지도 않고 변경하지도 않는 즉 부수효과가 없는 함수를 순수 함수라 하고 외부 상태에 의존하거나 외부 상태를 변경하는 즉 부수 효과가 있는 함수를 비순수 함수라고 합니다.

var count = 0; // 현재 카운트를 나타내는 상태

// 순수 함수 increase는 동일한 인수가 전달되면 언제나 동일한 값을 반환한다.
function increase(n) {
  return ++n;
}

// 순수 함수가 반환한 결과값을 변수에 재할당해서 상태를 변경
count = increase(count);
console.log(count); // 1

count = increase(count);
console.log(count); // 2

이렇게 의존하지 않으면 순수 함수라고 하고 반대로 비순수 함수는

var count = 0; // 현재 카운트를 나타내는 상태: increase 함수에 의해 변화한다.

// 비순수 함수
function increase() {
  return ++count; // 외부 상태에 의존하며 외부 상태를 변경한다.
}

// 비순수 함수는 외부 상태(count)를 변경하므로 상태 변화를 추적하기 어려워진다.
increase();
console.log(count); // 1

increase();
console.log(count); // 2

이렇다. 하지만 둘의 차이는 아직도 까리 하지만 일단 비순수 함수는 전역 변수의 count를 의존하고 변경을 한다.
하지만 순수함수는 count를 의존하지 않고 매개변수로 받아와서 쓴다.

즉 외부 count를 의존하지 않는다.

하지만 객체인 경우 매개변수를 통해 객체를 전달받으면 비순수 함수가 된다. 객체는 가변하는 성질이 있고 함수 내에 스코프에서도 변경을 할 수 있기 때문이다.

함수형 프로그래밍은 불변성을 지향해야한다. 누군가가 외부 값을 바꾸는 순간 불변성이 깨지는 것이다.

다음 블로거는 스코프에 대해서 쓸 것이다.

출저: https://poiemaweb.com/fastcampus/function

0개의 댓글