모나드
모나드는 *컨텍스트 레벨을 값 레벨로 끌어들여 추상화한 컨테이너박스를 말합니다.
함수형 프로그래밍에서는 참조 투명성이 이루어져야 하며 이를 위해 모나드를 사용한다.
컨텍스트 : 어떤 로직실행에 영향을 줄 수 있는 레지스터, 콜스택, 객체의 현재 상태 등에 해당하는 것
참조 투명성 : 함수가 함수외부의 영향을 받지 않는 것
const log = console.log
const users = [{name: '영민'},{name: '민호'},{name: '동준'},{name : '승태'},{name : '세민'}]
const getUserByName = (name) => users.find( u => u.name === name) || Promise.reject("객체에 없습니다.")
const g = getUserByName
const f = ({name})=> `${name}이가 있습니다.`
const fg = x => new Promise((resolve,reject)=> resolve(x)).then(g).then(f)
fg("정민").catch(_ => _).then(log) // '정민'이 user에 없으니 Promise.reject를 반환하고 catch가 받아 then(f)를 반환합니다. 원래 -> 객체에 없습니다.
fg("영민").catch(_ => _).then(log) // '영민'이 user에 있으니 Promise.resolve를 반환하고 catch가 받아 then(g)를 반환합니다.원래 -> 영민이가 있습니다.
출력 결과 :
영민이가 있습니다.
객체에 없습니다.
안전한 함수합성
클로저
클로저란 외부함수의 실행 컨텍스트가 소멸해도 [[scope]] 프로퍼티가 가리키는 외부함수의 실행환경이 소멸하지 않고 참조할 수 있는 것을 말합니다.
function makeCounter() {
let count = 0;
return function() {
return count++;
};
}
let counter = makeCounter();
예시로 위의 함수를 참고해보자.
makeCounter()가 실행될 때 본문안에있는 중첩함수가 만들어집니다. 이 함수가 생성될때 [[Environment]]라는 숨김 프로퍼티가 생기는데 이 프로퍼티가있음으로 counter.[[Environment]]에 {counter : 0} 이라는 값이 저장될 수 있습니다. 이러한 환경은 렉시컬 환경(
Lexical Environment)이라 할 수 있습니다.
즉 함수가 실행되면서 count 값이 1 증가하게되면, 변숫값 변경은 변수가 저장된 렉시컬 환경에서 이뤄집니다.
즉 자신이 선언될 당시의 환경을 기억한다 라고 이해하면 좋을것 같습니다.
'JS' 카테고리의 다른 글
클로저 문제 (0) | 2022.08.07 |
---|---|
뉴스 API를 이용하여 뉴스 검색기 만들기 (1) (4) | 2022.08.04 |
함수형 프로그래밍 2탄 (3) | 2022.07.15 |
함수 표현식과 선언식 (0) | 2022.07.15 |
IIFE (0) | 2022.07.13 |