O(n) : 선형시간
O(n2): 1000번
O(n3): 10000번
function outer() {
let a = 10;
return function inner() {
a++;
return a;
};
}
const fn = outer();
console.log(fn()); // 11
console.log(fn()); // 12
console.log(fn()); // 13
function outer2() {
let a2 = 10;
function inner2() {
a2++;
return a2;
}
return inner2();
}
const fn2 = outer2();
console.log(fn2); // 11
console.log(fn2); // 11
// 클로저 메모리 회수법
function outer() {
let a = 10;
return function inner() {
a++;
return a;
};
}
let fn = outer();
console.log(fn()); // 11
console.log(fn()); // 12
console.log(fn()); // 13
fn = null // 더 이상 outer() 안에 변수값을 참조하지 않음을 할당
내부 함수에서 자유 변수를 가리키고 있는 함수를 의미합니다.
→ 그러므로 주로 캡슐화가 필요한 로직에 사용합니다.
function counter() {
let count = 0; // 캡슐화
return {
inc: function () {
count++;
return count;
},
dec: function () {
count--;
return count;
},
};
}
const mycount = counter();
console.log(mycount.inc()); // 1
console.log(mycount.dec()); // 0
function makeMultiple(multipler) {
return function (x) {
return x * multipler;
};
}
const double = makeMultiple(2);
const triple = makeMultiple(3);
console.log(double(5)); // 2 * 5
console.log(triple(5)); // 3 * 5
동기언어 → 특정 코드가 실행되는 것을 기다림
비동기적으로 코드를 실행할 수 있게 함
function fetchData(url) {
let result;
return function (callback) {
setTimeout(() => {
result = "Fetched... success";
callback(result);
}, 1000);
};
}
const fetchFromNaver = fetchData("https://www.naver.com");
fetchFromNaver((data) => console.log(data)); // 1초 뒤 "Fetched... success"
// 알고리즘
// 시간복잡도가 O(n^5) > 엄청 느림
// 처음에는 느려도, 같은 요청이 다시 들어오면 빠르게!
function memoization(fn) {
const cache = {};
return function (...args) {
const key = JSON.stringify(args); // JSON 변환 -> 문자열로 취급
if (cache[key]) return cache[key];
const result = fn(...args);
cache[key] = result;
return result;
};
}
function slowFunction(num) {
for (let i = 0; i < 9999999999; i++);
return num * 2;
}
const memoizedFn = memoization(slowFunction);
console.log(memoizedFn(5)); // 8초
console.log(memoizedFn(5));
console.log(memoizedFn(5));
console.log(memoizedFn(5));