Daily Front_Minhhk

[12장] 자바스크립트 딥다이브_함수 본문

Study/JS_딥다이브

[12장] 자바스크립트 딥다이브_함수

Minhhk 2023. 11. 23. 16:28

함수

수학의 함수 → 입력을 받아 출력을 보내는 일련의 과정 정의.

프로그래밍 함수 → 일련의 과정을 문으로 구현, 코드 블록으로 감싸 하나의 실행단위로 정의.

  • 전달 변수 === 매개변수(parameter)
  • 입력 === 인수(argument)
  • 출력 === 반환 값(return value)

  • 유지보수의 편의성↑ , 코드의 신뢰성↑ , 코드의 가독성↑

기명 ↔ 익명 함수…

함수는 객체다 → 일반 객체는 호출할 수 없지만, 함수는 호출할 수있다.

 

변수는 선언한다.

함수는 정의 한다고 표현을 한다.

 

 

함수 선언문

function add(x,y) {
    return x + y
  }

_ 함수 이름을 생략할 수 없다.

_ 표현식이 아닌 문이다. → 문은 변수에 할당 불가,,

하지만 js엔진이 값으로 평가 될 때에는 함수 리터럴 표현식으로 해석.

 

함수 선언문

js엔진은 생성된 함수를 호출하기 위해,

함수 이름과 동일한 이름의 식별자를 암묵적으로 생성하고,

거기에 함수 객체를 할당한다.

 

따라서,, 함수 이름으로 호출이 아닌,

함수 객체를 가리키는 식별자로 호출

 

 

함수 표현식

값의 성질을 갖는 객체 → 일급객체 → js함수는 일급 객체!!

var add = function add (x,y) {
    return x + y
  }

console.log(add(2,5)) // 7
  • 함수 선언문으로 정의한 함수와, 표현식으로 정의한 함수의 생성 시점이 다르기 때문에,
  • 선언문으로 정의한 함수는 이전에 호출 가능,
  • 표현식으로 정의한 함수는 이전에 호출 불가!

선언문

→ 코드 한줄 씩 순차 실행되기 시작하는 런타임 이전에 함수 객체 먼저 생성 → 동일한 이름의 식별자를 암묵적 생성 → 생성된 함수 객체할당

⇒ 함수 선언문이 코드의 선두로 끌어 올려진 것 처럼 동작하는 js고유 특징인 함수 호이스팅 이라 한다.

⇒ 변수 할당문의 값은 할당문이 실행되는 시점, 즉 런타임에 평가되므로 함수 표현식의 함수 리터럴도 할당문이 실행되는 시점에 평가되어 함수 객체가 된다.

 

표현식

함수 표현식으로 함수를 정의하면 함수 호이스팅이 발생이 아닌, 변수 호이스팅이 발생한다.

  • 이전에 참조하면 , var 처럼 undefined로 평가됨 → type error 발생
  • 반드시 표현식 이후에 참조, 호출 하기!
// 화살표 함수,,

const a = () ⇒ {
  console.log(’arrow function’)
}

 

 

 

함수 호출

  • 매개변수는 함수 내부에서만 참조 가능!
  • 스코프는 함수 내부~
  • 인수가 부족 해도, 미할당 값은 undefined 로 되어, 결과는 NaN
  • 매개변수 보다 인수가 많은 경우? 초과된 인수는 무시된다. → arguments 객체 프로퍼티로 보관

이상적인 함수는 한가지 일만하며, 가급적 작게 만들어 활용하자!!

매개변수는 최대한 적게, 가능한 3개까지 정도만 사용권장~

 

 

반환문

  • return 키워드와 표현식(반환값)으로 이뤄진, 반환문을 실행 결과를 함수 외부로 반환 할 수 있다.
  • return 이후에 다른 문이 존재하면 실행 되지 않는다.
  • return 이후, 표현식(값)이 명시적 지정하지 않으면 undefined 반환
  • return 생략 하더라도, 암묵적 undefined 반환

 

📌 외부 상태를 변경 하지 않고, 상태 의존하지 않는 함수를 순수 함수.. 의 프로그래밍 패러다임을 ‘함수형 프로그래밍’ 이라고 한다!

 

 

 

다양한 함수의 형태

 

즉시 실행 함수 : 함수 정의와 동시에 호출되는 함수

  • 익명 함수를 사용하는 것이 일반적
  • 기명 함수는 함수 리터럴로 평가 되기 때문에, 다시 호출할 수 없다.
// 익명 즉시 실행 함수
(function () {
    var x = 3;
    var y = 5;
    return x + y;
  }());
// 기명 즉시 실행 함수
(function add() {
    var x = 3;
    var y = 5;
    return x + y;
  }());

add() // add is not defined

//

 

 

 

재귀함수 : 함수가 자신을 호출하는 것을 재귀 호출 → 재귀 호출을 수행하는 함수

  • 탈출 조건을 반드시 만들자!

 

 

 

중첩함수 : 함수 내부에 정의된 함수를 중첩 함수(내부 함수), 중첩 함수를 포함하는 함수는 외부 함수라고 함.

 

 

콜백함수 : 함수의 매개변수를 통해 다른 함수의 내부로 전달 되는 함수를 콜백 함수!

  • 매개 변수를 통해 함수의 외부에서 콜백 함수를 전달받은 함수를 고차 함수!
  • 고차 함수는 매개변수를 통해, 전달받은 콜백 함수의 호출 시점을 결정해서 호출
  • → 콜백 함수는 고차 함수에 의해 호출되며, 고차 함수는 필요에 따라 콜백 함수에 인수를 전달할 수 있다.
// 익명 함수 리터럴을 콜백 함수로 고차 함수에 전달.
// 익명 함수 리터럴은 repeats 함수 호출 시 마다 평가되어 함수 객체 생성한다.
repeats(5, function (i) {
    if(i % 2) console.log(i)
  }) // 1 3

	// logOdds 함수는 단 한 번만 생성.
  var logOdds = function (i) {
    if (i % 2) console.log(i)
  }

	// 고차 함수에 함수 참조를 전달
  repeat(5, logOdds) // 1 3

 

→ 콜백 함수는 함수형 프로그래밍 패러다임 뿐만 아니라, 비동기 처리(이벤트, Ajax 통신, 타이머 함수)에 활용되는 중요한 패턴

→ 콜백 함수를 사용하는 배열 고차 함수

 

  //콜백 함수를 사용하는 고차 함수 map
  var res = [1, 2, 3].map(function (item) {
  return item * 2;
  })
  console.log(res); // [2, 4, 6]

  //콜백 함수를 사용하는 고차 함수 filter
  res = [1, 2, 3].filter(function (item) {
  return item % 2;
  })
  console.log(res); // [1, 3]

  //콜백 함수를 사용하는 고차 함수 reduce
  res = [1, 2, 3].reduce(function (acc, cur) {
  return acc + cur
  }, 0);
  console.log(res); // 6

 

 

 

순수함수

: 어떤 외부 상태에 의존하지 않고, 변경하지도 않는, 즉 부수 효과가 없는 함수를 순수 함수__

  • 동일한 인수가 전달 되면, 언제나 동일한 값을 반환
  • 오직 매개변수를 통해 내부로 전달 된 인수에게 의존해 값을 생성
  • 최소 하나 이상의 인수를 받음, 없으면 내부 상태의존 하기 때문에 결국 상수의 값임.
  • 결국 인수의 불변성을 유지
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

 

→ 상태 변화를 추적하기 어려워짐

 

 

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