함수가 선언될때 렉시컬 환경을 기억하는 기능
회부 함수의 스코프의 변수에 접근할 수 있는 기능
주요 특징
const outerFunc = () => {
let x = 10; // '자유 변수' 라고 한다.
// 클로저
const innerFunc = (y) => {
x = x + y;
console.log(x);
}
return innerFunc;
}
const addFunc = outerFunc();
addFunc(5); // 15
addFunc(10); // 25
function createClosure() {
let largeData = new Array(1000000).fill("data");
return function () {
console.log(largeData.length);
};
}
const closure = createClosure();
closure(); // 1000000
// 메모리 해제
closure = null;
정보 은닉
const user = () => {
let userName = ''; // private
return {
getUserName: function() {
return userName;
},
setUserName: function(_userName) {
userName = _userName;
}
};
}
const user1 = user();
user1.getUserName(); // ''
user1.setUserName('Chojs');
user1.getUserName(); // Chojs
부분 적용 함수
const debounce = (eventName, func, wait) => {
let timerId = null;
return function(event) {
let self = this;
clearTime(timerId);
timerId = setTimeout(func.bind(self, event), wait);
};
};
const mousemoveHandler = () => {
console.log('wait 시간 내 많은 이벤트 발생 시 한번만 호출됨');
}
document.body.addEventListener('mousemove', debounce('mousemove', mousemoveHandler, 500));
커링
// 커링 함수
const curry = (func) => (a) => (b) => func(a, b);
const sum = (a, b) => (a + b);
let curriedSum = curry(sum);
console.log(curriedSum(1)(2)); // 3
const log = (date) => (importance) => (message) => {
return `[${date.getHours()}:${date.getMinutes()}] [${importance}] ${message}`;
}
function log(date) {
return function(importance) {
return function(message) {
return `[${date.getHours()}:${date.getMinutes()}] [${importance}] ${message}`;
};
};
}
// 기본
console.log(log(new Date())("WARNING")("Reference Error!!!")); // '[15:54] [WARNING] Reference Error!!!'
// 응용
const logNow = log(new Date());
console.log(logNow("INFO")("message")); // '[16:51] [INFO] message'
const debugNow = logNow("DEBUG");
console.log(debugNow("message")); // '[16:59] [DEBUG] message'