2020/03/08
한 번에 완전히 이해하기에 쉽지 않은 개념이지만, 오늘은 JavaScript 중 closure에 대하여 학습해보았습니다. 틀린 부분이 있다면 댓글로 따끔히 혼내주세요.
const a = () => {
let name = 'jotang';
};
const a = () => {
let name = 'jotang';
};
console.log(name); // error
const a = () => {
let name = 'jotang';
console.log(name);
};
a(); //console.log() 가 호출되어 'jotang'
const a = () => {
let name = 'jotang';
const consoleName = () => {
console.log(name);
};
consoleName();
};
// a() => consoleName() => console.log() => 'jotang'
const a = () => {
let name = 'jotang';
const consoleName = () => {
console.log(name);
};
return consoleName;
};
// a() 는 함수인 consoleName 그 자체를 return 한다.
// consoleName() 호출이 되는 것이 아니다
const result = a();
// result는 결국 a()의 return 값인 consoleName 함수이다.
// result는 함수라고 부를 수 있다.
result();
// result() => consoleName() => console.log() => 'jotang'
Closure
라고 부른다.const makeClosure = value => {
const innerValue = value;
const getValue = () => {
retrun innerValue;
}
return getValue
}
const getInnerValue = makeClosure('하이루')
getInnerValue() // '안녕하세요'
innerValue // Error
const makeClosure = initialValue => {
let innerValue = initialValue;
const getValue = () => {
return innerValue;
};
const setValue = nextValue => {
innerValue = nextValue;
};
return {
get: getValue,
set: setValue,
};
};
const innerData = makeClosure('안녕하세요');
innerData.get(); // '안녕하세요'
innerData.set('잘가세요');
innerData.get(); // '잘가세요'
const createCard = string => {
let status = false;
let pw = string;
let balance = 0;
const arr = [];
const password = (originPassword, changePassword) => {
if (pw !== originPassword) {
console.log('비번이 달라요');
return false;
} else if (pw === originPassword) {
pw = changePassword;
return balance;
}
};
// password변경, 기존의 pw와 첫번째 인자로 받은 originPassword와 같으면 두번째 인자로 받은 changePassword로 변경
const unlock = password => {
if (pw === password) {
status = true;
return status;
} else {
console.log('암호틀렸어 누구냐 너');
status = false;
return status;
}
};
// 비밀번호 확인을 통한 잠금해제
const lock = () => {
status = false;
};
// 잠금기능
const current = () => {
if (status) {
return balance;
} else {
console.log('잠금풀어요');
return status;
}
};
// 현재 잔액
const charge = chargeMoney => {
if (status) {
if (typeof chargeMoney === 'number') {
balance = balance + chargeMoney;
amount = chargeMoney;
arr.push({
type: '충전',
amount: chargeMoney,
balance: balance,
});
return balance;
} else {
console.log('금액 똑바로 넣어라');
}
} else {
console.log('잠금부터 풀어');
return status;
}
};
// 충전!
const use = () => {
if (status) {
if (balance < 1200) {
console.log('잔액이 부족합니다');
return balance;
} else {
balance = balance - 1200;
amount = 1200;
arr.push({
type: '사용',
amount: amount,
balance: balance,
});
return balance;
}
} else {
console.log('잠금부터 풀어');
return status;
}
};
// 사용!
const history = () => {
return arr;
};
// 충전, 사용 내역!
return {
current: current,
charge: charge,
use: use,
history: history,
unlock: unlock,
lock: lock,
password: password,
};
};
const myCard = createCard('jotang');
myCard.use(); // 잠금잠금
myCard.charge(1000); // 잠금잠금
myCard.unlock('1234'); // 암호틀림
myCard.unlock('jotang'); // 현재 잔액 return
myCard.charge(10000); // 10000
myCard.use(); // 8800
myCard.lock();
myCard.use(); // 잠금상태입니다