함수와 함수형 프로그래밍

wh·2022년 3월 22일
0

고차함수

함수는 값으로 취급하며 이를 변수에 저장하거나, 인수로 전달하거나, 다른 함수의 결과로 반환할 수 있다.

result = [0, 1, 4].map(Math.sqrt) // [0, 1, 2]

map 메서드처럼 다른 함수를 소비하는 메서드를 고차함수(higher-order function)라 한다.

화살표함수

객체리터럴을 반환하는 화살표함수는 괄호로 객체를 감싸야한다. 그렇지 않으면 중괄호를 블럭으로 인식한다.

const stats = (x, y) => ({
  average: (x + y) / 2,
  distance: Math.abs(x -y)
})

함수형 배열처리

forEach 메서드는 결과를 반환하지 않으므로 forEach에 전달한 함수는 반드시 부작용을 포함해야 한다.

arr.forEach((element, index) => { console.log(`${index}: ${element}`) })

map, filter, join 메서드는 값을 반환하거나 부작용을 일으키지 않는 상황

const enclose = (tag, contents) => `<${tag}$>{contents}</${tag}>`
const listitems = item.map(i=> enclose('li', i))

클로저

const sayLater (text, when) => {
  let task = () => console.log(text)
  setTimeout(task, when)
}
sayLater('Hello', 1000)
sayLater('Goodbye', 1000)

함수는 1.코드블록, 2.매개변수, 3.자유변수 free variable (매개변수나 지역변수로 선언죄디 않은 다른 변수 ) 로 구성되어 있다.
자유변수를 포함하는 함수를 클로저 closure 라 한다.

let text = 'Goodbye'
setTimeout(() => console.log(text), 1000)
text = 'Hello'
/// Hello

하드객체

하드객체 hard object = 클로저 패턴 = 팩토리 클래스 패턴

const createAccount = (initialBalance) => {
  let balance = initialBalance + 10
  return {
    deposit: (amount) => {
      balance += amount
    },
    withdraw: (amount) => {
      if (balance >= amount) balance -= amount
    },
    getBalance: () => balance
  }
}

엄격모드

'use strict'

모든 변수 선언
NaN, undefined 에 값을 할당할 수 없다
함수는 스크립트나 함수의 가장 최상위 수준에서만 선언
유효한 식별자에서만 delete 연산사용
매개변수 중복 불가

인수형식검사

형식검사
문자열typeof x==='string' || x instanceof String
정규표현식x instanceof RegExp
숫자typeof x==='number' || x instanceof Number
숫자로 변환가능한 모든 형식typeof +x==='number'
배열Array.isArray(x)
함수typeof x==='function'

기본인수

const average = (x=0, y=x) => (x+y)/2

나머지 매개변수와 스프레드 연산자

let numbers = [1, 2, 3, 4]
Math.max(...numbers) // 스프레드 연산자
const [first, ... others] = numbers  // 나머지 매개변수 선언

비구조화로 명명된 인수 흉내내기

자바스크립트에는 인수에 이름을 붙이는 기능을 지원하지 않지만, 객체리터럴을 이용하여 흉내낼수 있다.

const mkString = (array, {
  separator = ',',
  leftDelimiter = '[',
  rightDelimiter = ']'
} = {}) => {
  ...
}

호이스팅

자바스크립트의 모든 선언은 범위의 가장 윗부분으로 호이스팅 hoisting 된다
엄격모드를 사용하면서 var 을 사용하지 않으면 호이스팅으로 인해 오류가 발생할 가능성이 크게 줄어든다.

이전엔 즉시함수호룰 을 이용해 범위를 제한했다.

(function () {
  var someVariable = 33
  function someFunction(...) { ... }
  ...
})() // () 를 이용해 여기서 함수호출
// somevariable, someFunction  은 더 이상 범위에 없음

요즘엔 간단하게 아래처럼 익명함수를 선언하고, 범위는 븍록내로 제한된다.

{ 
  let someVariable = 33
  const someFunction = (...) => { ... }
  ...
}

예외

함수가 결과를 계산할 수 없을 때에는 NaN 이나 undefined 보다 예외를 던지는 것이 좋다.
finally 절은 반드시 실행되고 return/break/throw 를 추가하면 혼란이 발생한다.

try {
  // 작업처리
} catch (e) {
  console.log(e)
  throw e
} finally {
  // 자원해제등 작업
  ...
}

연습문제

function indexOf(arr, value) {
    for (let i in arr ) {
        if (arr[i] === value) return i
    }
    return -1
}
indexOf({'prop1':3, prop2:4}, 3) // 'prop1'
indexOf({'prop1':3, prop2:4}, 1) // -1
// 양의 정수 내림차순
[1, 3, 5, 6].sort((x,y) => y - x )

// 사람을 연령 오름차순
[{'name':'john', 'age': 11}, {'name':'petti', 'age': 13}, {'name':'merian', 'age': 10}].sort((x,y) => x.age - y.age )

// 문자열 오름차순
['abc', 'bcde', 'abcd', 'abc'].sort()

// 문자열 내림차순
['abc', 'bcde', 'abcd', 'abc'].sort((x,y) => x > y ? -1 : (x < y ? 1 : 0))
profile
js

0개의 댓글

관련 채용 정보