
prototype chain 이라는 것 덕분에 Function 객체 밑에있는 bind, apply, call등의 함수에 접근할 수 있는 것 이다.function add(a,b){
	return a+b
}
// 함수를 다른 함수의 인자로 넘긴다.
[1, 2, 3].reduce(add, 0)
(() => {
	console.log('익명 함수를 생성한다.')
})()
function outer(a){
	function inner(b){
    	return a+b
    }  // 중접함수를 생성한다.
    return inner(10)
}
const Person = (name) => {
	// 함수를 변수로 생성한다.
    const printName = () => console.log(name)
    return {printName}
}  // 함수를 리턴하며 closure를 생성한다.
const person = Person('Daniel')    
person.printName()
function printName(name){
	console.log('name :', name)
}
// 함수끼리 비교한다.
// ===의 경우, 변수가 같은 객체(함수)를 가르키는지 체크한다.
console.log(printName === person.printName)
function createCard() {
	let title = "";
    let content = "";
    function changeTitle(text) {title = text}
    function changeContent(text) {content = text}
    function print() { 
    	console.log("TITLE -", title);
        console.log("CONTENT -", content);
    }
    return {changeTitle, changeContent, print};
}
    
const card1 = createCard();
card1.changeTitle("생일카드");
card1.changeContent("생일 축하해");
card1.print();
const card2 = createCard();
card2.changeTitle("감사카드");
card2.changeContent("고마워");
card2.print();
createCard()는 card라는 closure를 생성하는 팩토리 함수이다.let rate = 1.05;
function app(){
	let base = 10;
    return function (price){
    	return price * rate + base;
    };
}
const getPrice = app();
getPrice(120)  //136
console.log(app()(1));  // 11.05
rate = 1.1;
console.log(app()(1));  // 11.1
상태 유지 => 앞서 언급한 예제와 가장 비슷하며 factory 함수처럼 어떠한 함수를 return함으로써 return 당시의 상태를 기억하여 prop들의 상태를 유지해주는 것이다.
정보은닉 => private를 흉내낼 수 있는 방법으로 한마디로 setter 메서드를 생성하지 않음으로써 변수(prop) 값에 접근할 수 없도록 하는 방법이 있다.