JavaScript ๋์ ์๋ฆฌ๋ ๋ฌด์์ธ๊ฐ
JavaScript๋ฅผ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ์ ๊ธฐํ ํ์์ ๊ฒฝํํ๋ค.
setTimeout์ 0์ด๋ก ์ค์ ํด๋ ์ฝ๋๊ฐ ๋์ค์ ์คํ๋๊ฑฐ๋,
ํจ์๋ฅผ ์ ์ธํ๊ธฐ ์ ์ ํธ์ถํด๋ ๋์ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์ด๋ ๋ง์น ์๋น ์ฃผ๋ฐฉ๊ณผ ๊ฐ๋ค.
์ฃผ๋ฐฉ์ฅ(JavaScript ์์ง)์ ํ ๋ฒ์ ํ ๊ฐ์ง ์๋ฆฌ๋ง ๋ง๋ค์ง๋ง(์ฑ๊ธ ์ค๋ ๋),
์ค๋ธ์ ์์์ ๋ฃ๊ณ ํ์ด๋จธ๋ฅผ ๋ง์ถฐ๋๋ฉด(๋น๋๊ธฐ),
๊ทธ ์ฌ์ด์ ๋ค๋ฅธ ์๋ฆฌ๋ฅผ ๊ณ์ํ ์ ์๋ค.
JavaScript์ ๋์ ์๋ฆฌ๋ฅผ ์ดํดํ๋ฉด
์ ์ฝ๋๊ฐ ํน์ ์์๋ก ์คํ๋๋์ง,
๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์ง ๋ช
ํํ๊ฒ ์ ์ ์๋ค.
์ JavaScript ๋์ ์๋ฆฌ๋ฅผ ์์์ผ ํ ๊น?
๋ฌธ์ 1: ์์์น ๋ชปํ ์คํ ์์
๋น๋๊ธฐ ์ฝ๋๊ฐ ์ธ์ ์คํ๋ ์ง ๋ชจ๋ฅด๋ฉด ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๋ค.
๋ฌธ์ 2: ์ฑ๋ฅ ๋ฌธ์
๋ฌด๊ฑฐ์ด ์์
์ด ํ๋ฉด์ ๋ฉ์ถ๊ฒ ๋ง๋ ๋ค.
๋ฌธ์ 3: ๋ฉด์ ๋จ๊ณจ ์ง๋ฌธ
์ด๋ฒคํธ ๋ฃจํ, ์ฝ ์คํ์ ํ๋ก ํธ์๋ ๋ฉด์ ํ์ ์ฃผ์
๋ฌธ์ 4: ๋๋ฒ๊น
์ด๋ ค์
์คํ ์์๋ฅผ ๋ชจ๋ฅด๋ฉด ์๋ฌ ์ถ์ ์ด ํ๋ค๋ค.
๊ธฐ๋ณธ ๊ฐ๋ ์์ฝ
๐ท๏ธ JavaScript๋ ์ฑ๊ธ ์ค๋ ๋
๊ฐ๋
: ํ ๋ฒ์ ํ๋์ ์์
๋ง ์ฒ๋ฆฌ
์๋น ๋น์ :
์ฃผ๋ฐฉ์ฅ์ด ํ ๋ช
์ด๋ผ ํ ๋ฒ์ ํ๋์ ์๋ฆฌ๋ง ๋ง๋ ๋ค.
ํ์ง๋ง ์ค๋ธ, ๋์ฅ๊ณ (Web APIs)๋ฅผ ํ์ฉํด์
ํจ์จ์ ์ผ๋ก ์ฌ๋ฌ ์๋ฆฌ๋ฅผ ๋์์ ์งํํ ์ ์๋ค.
์ฅ์ : ๊ฐ๋จํ๊ณ ์์ธก ๊ฐ๋ฅ
๋จ์ : ๋ฌด๊ฑฐ์ด ์์
์ด ์ ์ฒด๋ฅผ ๋ง์ ์ ์์
๐ท๏ธ JavaScript ์คํ ํ๊ฒฝ
1. JavaScript ์์ง (V8, SpiderMonkey)
๊ตฌ์ฑ ์์:
- ํ(Heap): ๋ณ์, ๊ฐ์ฒด ์ ์ฅ (๋ฉ๋ชจ๋ฆฌ)
- ์ฝ ์คํ(Call Stack): ํจ์ ์คํ ์์ ๊ด๋ฆฌ
2. Web APIs
๋ธ๋ผ์ฐ์ ๊ฐ ์ ๊ณตํ๋ ๋น๋๊ธฐ ๊ธฐ๋ฅ:
- setTimeout / setInterval
- DOM ์ด๋ฒคํธ
- fetch (HTTP ์์ฒญ)
- Promise
3. ํ์คํฌ ํ (Task Queue)
๋น๋๊ธฐ ์์
์ด ์๋ฃ๋๋ฉด ๋๊ธฐํ๋ ๊ณณ
4. ์ด๋ฒคํธ ๋ฃจํ (Event Loop)
์ฝ ์คํ๊ณผ ํ์คํฌ ํ๋ฅผ ๊ฐ์ํ๋ฉฐ ์์
์กฐ์จ
๐ท๏ธ ์ฝ ์คํ (Call Stack)
๊ฐ๋
: ํจ์ ํธ์ถ์ ์ถ์ ํ๋ ์คํ ์๋ฃ๊ตฌ์กฐ
๋์ ๋ฐฉ์:
- ํจ์ ํธ์ถ โ ์คํ์ push
- ํจ์ ์ข ๋ฃ โ ์คํ์์ pop
- LIFO (Last In First Out)
์์:
function first() {
console.log("์ฒซ ๋ฒ์งธ");
second();
console.log("์ฒซ ๋ฒ์งธ ๋");
}
function second() {
console.log("๋ ๋ฒ์งธ");
}
first();
// ์ฝ ์คํ ์์:
// 1. first() push
// 2. console.log("์ฒซ ๋ฒ์งธ") push โ pop
// 3. second() push
// 4. console.log("๋ ๋ฒ์งธ") push โ pop
// 5. second() pop
// 6. console.log("์ฒซ ๋ฒ์งธ ๋") push โ pop
// 7. first() pop
๐ท๏ธ ์ด๋ฒคํธ ๋ฃจํ (Event Loop)
๊ฐ๋
: ์ฝ ์คํ์ด ๋น์ด์์ผ๋ฉด ํ์คํฌ ํ์์ ์์
์ ๊ฐ์ ธ์ด
๋์ ์๋ฆฌ:
1. ์ฝ ์คํ ํ์ธ
2. ๋น์ด์์ผ๋ฉด โ ํ์คํฌ ํ์์ ๊ฐ์ ธ์ค๊ธฐ
3. ๋น์ด์์ง ์์ผ๋ฉด โ ๋๊ธฐ
4. ๋ฐ๋ณต
ํต์ฌ ๊ท์น:
์ฝ ์คํ์ด ์์ ํ ๋น์ด์ผ๋ง ํ์คํฌ ํ์ ์์
์คํ
๐ท๏ธ ๋งคํฌ๋กํ์คํฌ vs ๋ง์ดํฌ๋กํ์คํฌ
๋งคํฌ๋กํ์คํฌ (Macrotask)
- setTimeout
- setInterval
- setImmediate
- I/O ์์
๋ง์ดํฌ๋กํ์คํฌ (Microtask)
- Promise.then
- queueMicrotask
- MutationObserver
์ฐ์ ์์: ๋ง์ดํฌ๋กํ์คํฌ๊ฐ ๋งคํฌ๋กํ์คํฌ๋ณด๋ค ๋จผ์ ์คํ
์คํ ์์:
- ์ฝ ์คํ ์คํ
- ๋ชจ๋ ๋ง์ดํฌ๋กํ์คํฌ ์คํ
- ๋งคํฌ๋กํ์คํฌ ํ๋ ์คํ
- ๋ค์ ๋ง์ดํฌ๋กํ์คํฌ ๋ชจ๋ ์คํ
- ๋ฐ๋ณต
์ค์ ์์
์ฝ ์คํ ๋์ ์ดํดํ๊ธฐ
function multiply(a, b) {
return a * b;
}
function square(n) {
return multiply(n, n);
}
function printSquare(n) {
const result = square(n);
console.log(result);
}
printSquare(4);
// ์ฝ ์คํ ๋ณํ:
// 1. [printSquare(4)]
// 2. [printSquare(4), square(4)]
// 3. [printSquare(4), square(4), multiply(4, 4)]
// 4. [printSquare(4), square(4)] // multiply ๋ฆฌํด
// 5. [printSquare(4)] // square ๋ฆฌํด
// 6. [printSquare(4), console.log(16)]
// 7. [] // ๋ชจ๋ ์๋ฃ
// ์ถ๋ ฅ: 16
๋น๋๊ธฐ ์ฝ๋ ์คํ ์์
console.log("1");
setTimeout(() => {
console.log("2");
}, 0);
console.log("3");
// ์ถ๋ ฅ:
// 1
// 3
// 2
// ์?
// 1. console.log("1") ์คํ (์ฝ ์คํ)
// 2. setTimeout์ Web API๋ก ์ด๋ (์ฝ ์คํ์์ ์ ๊ฑฐ)
// 3. console.log("3") ์คํ (์ฝ ์คํ)
// 4. ์ฝ ์คํ ๋น์
// 5. ์ด๋ฒคํธ ๋ฃจํ๊ฐ ํ์คํฌ ํ์์ setTimeout ์ฝ๋ฐฑ ๊ฐ์ ธ์ด
// 6. console.log("2") ์คํ
Promise vs setTimeout ์ฐ์ ์์
console.log("์์");
setTimeout(() => {
console.log("setTimeout");
}, 0);
Promise.resolve()
.then(() => {
console.log("Promise 1");
})
.then(() => {
console.log("Promise 2");
});
console.log("๋");
// ์ถ๋ ฅ ์์:
// ์์
// ๋
// Promise 1
// Promise 2
// setTimeout
// ์ด์ :
// 1. ๋๊ธฐ ์ฝ๋ ๋จผ์ (์์, ๋)
// 2. ๋ง์ดํฌ๋กํ์คํฌ (Promise)
// 3. ๋งคํฌ๋กํ์คํฌ (setTimeout)
์ด๋ฒคํธ ๋ฃจํ ์์ธ ์์
console.log("Script start");
setTimeout(function timeout() {
console.log("setTimeout");
}, 0);
Promise.resolve()
.then(function promise1() {
console.log("Promise 1");
})
.then(function promise2() {
console.log("Promise 2");
});
requestAnimationFrame(function animation() {
console.log("requestAnimationFrame");
});
console.log("Script end");
// ์ถ๋ ฅ ์์:
// Script start
// Script end
// Promise 1
// Promise 2
// requestAnimationFrame (๋ค์ ํ๋ ์)
// setTimeout
// ์คํ ์์:
// 1. ๋๊ธฐ ์ฝ๋ ์คํ (์ฝ ์คํ)
// 2. ๋ง์ดํฌ๋กํ์คํฌ ํ ๋น์ฐ๊ธฐ (Promise)
// 3. ๋ ๋๋ง (requestAnimationFrame)
// 4. ๋งคํฌ๋กํ์คํฌ ํ์์ ํ๋ ์คํ (setTimeout)
๋ฌดํ ๋ฃจํ๋ก ์ธํ ์คํ ์ค๋ฒํ๋ก์ฐ
// โ ์คํ ์ค๋ฒํ๋ก์ฐ ๋ฐ์
function recursiveFunction() {
recursiveFunction();
}
// recursiveFunction(); // Uncaught RangeError: Maximum call stack size exceeded
// โ
setTimeout์ผ๋ก ํด๊ฒฐ
function safeRecursive() {
console.log("์คํ");
setTimeout(safeRecursive, 0);
}
// safeRecursive(); // ๋ฌดํ ์คํ๋์ง๋ง ์คํ์ ์์
์ด์ :
setTimeout์ ์ฝ๋ฐฑ์ ํ์คํฌ ํ๋ก ๋ณด๋ด๋ฏ๋ก
์ฝ ์คํ์ด ๋งค๋ฒ ๋น์์ง๋ค.
๋ธ๋กํน vs ๋ ผ๋ธ๋กํน
๋ธ๋กํน ์ฝ๋ (๋์ ์)
// โ 5์ด ๋์ ํ๋ฉด์ด ๋ฉ์ถค
const startTime = Date.now();
while (Date.now() - startTime < 5000) {
// 5์ด ๋๊ธฐ
}
console.log("5์ด ๊ฒฝ๊ณผ");
๋ ผ๋ธ๋กํน ์ฝ๋ (์ข์ ์)
// โ
ํ๋ฉด์ด ๋ฉ์ถ์ง ์์
setTimeout(() => {
console.log("5์ด ๊ฒฝ๊ณผ");
}, 5000);
console.log("๋ค๋ฅธ ์์
๊ณ์ ๊ฐ๋ฅ");
์คํ ์ปจํ ์คํธ (Execution Context)
๐ท๏ธ ์คํ ์ปจํ ์คํธ๋?
๊ฐ๋
: ์ฝ๋๊ฐ ์คํ๋๋ ํ๊ฒฝ
๊ตฌ์ฑ ์์:
- Variable Environment: ๋ณ์, ํจ์ ์ ์ธ ์ ์ฅ
- Lexical Environment: ์ค์ฝํ ์ฒด์ธ
- this ๋ฐ์ธ๋ฉ
๐ท๏ธ ์คํ ์ปจํ ์คํธ ์์ฑ ๊ณผ์
1. Creation Phase (์์ฑ ๋จ๊ณ)
console.log(name); // undefined (ํธ์ด์คํ
)
var name = "ํ๊ธธ๋";
// Creation Phase:
// - name ๋ณ์ ์ ์ธ (๊ฐ์ undefined)
// - ํจ์ ์ ์ธ ์ ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ
2. Execution Phase (์คํ ๋จ๊ณ)
var name = "ํ๊ธธ๋";
console.log(name); // "ํ๊ธธ๋"
// Execution Phase:
// - name์ "ํ๊ธธ๋" ํ ๋น
// - ์ฝ๋ ํ ์ค์ฉ ์คํ
๐ท๏ธ ํธ์ด์คํ (Hoisting)
๊ฐ๋
: ์ ์ธ์ด ์ค์ฝํ ์ต์๋จ์ผ๋ก ๋์ด์ฌ๋ ค์ง๋ ๊ฒ์ฒ๋ผ ๋์
var ํธ์ด์คํ
console.log(age); // undefined
var age = 30;
// ์ ์ฝ๋๋ ๋ด๋ถ์ ์ผ๋ก ์ด๋ ๊ฒ ๋์:
var age;
console.log(age); // undefined
age = 30;
ํจ์ ํธ์ด์คํ
// โ
ํจ์ ์ ์ธ์: ํธ์ด์คํ
๋จ
sayHello(); // "Hello!"
function sayHello() {
console.log("Hello!");
}
// โ ํจ์ ํํ์: ํธ์ด์คํ
์ ๋จ
sayBye(); // TypeError: sayBye is not a function
var sayBye = function () {
console.log("Bye!");
};
let/const๋ ํธ์ด์คํ ๋์ง๋ง TDZ
// โ ReferenceError
console.log(name); // Cannot access 'name' before initialization
let name = "ํ๊ธธ๋";
// TDZ (Temporal Dead Zone):
// ์ ์ธ์ ํธ์ด์คํ
๋์ง๋ง ์ด๊ธฐํ ์ ๊น์ง ์ ๊ทผ ๋ถ๊ฐ
์ค์ฝํ (Scope)
๐ท๏ธ ์ค์ฝํ๋?
๊ฐ๋
: ๋ณ์์ ์ ๊ทผํ ์ ์๋ ๋ฒ์
1. ์ ์ญ ์ค์ฝํ (Global Scope)
const globalVar = "์ ์ญ ๋ณ์";
function test() {
console.log(globalVar); // ์ ๊ทผ ๊ฐ๋ฅ
}
2. ํจ์ ์ค์ฝํ (Function Scope)
function outer() {
const outerVar = "outer";
function inner() {
console.log(outerVar); // ์ ๊ทผ ๊ฐ๋ฅ (์ค์ฝํ ์ฒด์ธ)
}
inner();
}
// console.log(outerVar); // ReferenceError
3. ๋ธ๋ก ์ค์ฝํ (Block Scope)
if (true) {
let blockVar = "๋ธ๋ก ๋ณ์";
const blockConst = "๋ธ๋ก ์์";
var functionVar = "ํจ์ ๋ณ์";
}
// console.log(blockVar); // ReferenceError
// console.log(blockConst); // ReferenceError
console.log(functionVar); // "ํจ์ ๋ณ์" (var๋ ๋ธ๋ก ์ค์ฝํ ๋ฌด์)
๐ท๏ธ ์ค์ฝํ ์ฒด์ธ
const global = "์ ์ญ";
function outer() {
const outerVar = "outer";
function inner() {
const innerVar = "inner";
console.log(innerVar); // inner
console.log(outerVar); // outer (์์ ์ค์ฝํ ์ฐธ์กฐ)
console.log(global); // ์ ์ญ (์ต์์ ์ค์ฝํ ์ฐธ์กฐ)
}
inner();
}
outer();
// ์ค์ฝํ ์ฒด์ธ:
// inner โ outer โ global
ํด๋ก์ (Closure)
๐ท๏ธ ํด๋ก์ ๋?
๊ฐ๋
: ํจ์๊ฐ ์ ์ธ๋ ๋์ ๋ ์์ปฌ ํ๊ฒฝ์ ๊ธฐ์ตํ๋ ํจ์
function makeCounter() {
let count = 0; // ์ธ๋ถ ํจ์์ ๋ณ์
return function () {
count++;
return count;
};
}
const counter = makeCounter();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3
// counter ํจ์๋ count ๋ณ์๋ฅผ ๊ธฐ์ตํจ (ํด๋ก์ )
๐ท๏ธ ํด๋ก์ ํ์ฉ ์์
1. ๋ฐ์ดํฐ ์๋ (Private ๋ณ์)
function createWallet() {
let balance = 0; // private ๋ณ์
return {
deposit(amount) {
balance += amount;
return balance;
},
withdraw(amount) {
if (balance >= amount) {
balance -= amount;
return balance;
}
return "์์ก ๋ถ์กฑ";
},
getBalance() {
return balance;
},
};
}
const myWallet = createWallet();
myWallet.deposit(1000); // 1000
myWallet.withdraw(300); // 700
console.log(myWallet.getBalance()); // 700
// balance์ ์ง์ ์ ๊ทผ ๋ถ๊ฐ
console.log(myWallet.balance); // undefined
2. ํจ์ ํฉํ ๋ฆฌ
function makeMultiplier(multiplier) {
return function (number) {
return number * multiplier;
};
}
const double = makeMultiplier(2);
const triple = makeMultiplier(3);
console.log(double(5)); // 10
console.log(triple(5)); // 15
3. ์ด๋ฒคํธ ํธ๋ค๋ฌ
function setupButtons() {
for (let i = 0; i < 3; i++) {
const button = document.getElementById(`btn${i}`);
button.addEventListener("click", function () {
console.log(`๋ฒํผ ${i} ํด๋ฆญ`); // i๋ฅผ ๊ธฐ์ต (ํด๋ก์ )
});
}
}
// var ์ฌ์ฉ ์ ๋ฌธ์
function setupButtonsBad() {
for (var i = 0; i < 3; i++) {
const button = document.getElementById(`btn${i}`);
button.addEventListener("click", function () {
console.log(`๋ฒํผ ${i} ํด๋ฆญ`); // ํญ์ 3 ์ถ๋ ฅ
});
}
}
๋น๋๊ธฐ ์ฒ๋ฆฌ ํจํด
๐ท๏ธ ์ฝ๋ฐฑ (Callback)
function fetchUser(callback) {
setTimeout(() => {
const user = { name: "ํ๊ธธ๋", age: 30 };
callback(user);
}, 1000);
}
fetchUser((user) => {
console.log(user); // { name: "ํ๊ธธ๋", age: 30 }
});
๋ฌธ์ ์ : ์ฝ๋ฐฑ ์ง์ฅ (Callback Hell)
// โ ์ฝ๋ฐฑ ์ง์ฅ
fetchUser((user) => {
fetchPosts(user.id, (posts) => {
fetchComments(posts[0].id, (comments) => {
console.log(comments);
});
});
});
๐ท๏ธ Promise
function fetchUser() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const user = { name: "ํ๊ธธ๋", age: 30 };
resolve(user);
}, 1000);
});
}
fetchUser()
.then((user) => {
console.log(user);
return fetchPosts(user.id);
})
.then((posts) => {
console.log(posts);
return fetchComments(posts[0].id);
})
.then((comments) => {
console.log(comments);
})
.catch((error) => {
console.error(error);
});
๐ท๏ธ Async/Await
async function getUserData() {
try {
const user = await fetchUser();
console.log(user);
const posts = await fetchPosts(user.id);
console.log(posts);
const comments = await fetchComments(posts[0].id);
console.log(comments);
} catch (error) {
console.error(error);
}
}
getUserData();
์ฅ์ : ๋๊ธฐ ์ฝ๋์ฒ๋ผ ์ฝ๊ธฐ ์ฌ์
์ค์ ์ฒดํฌ๋ฆฌ์คํธ
โ ์ฝ ์คํ ์ดํด
- ํจ์ ํธ์ถ ์์๋ฅผ ์ถ์ ํ ์ ์๋๊ฐ?
- ์คํ ์ค๋ฒํ๋ก์ฐ ์์ธ์ ์๋๊ฐ?
- ์ฌ๊ท ํจ์์ ์ฝ ์คํ์ ์ดํดํ๋๊ฐ?
โ ์ด๋ฒคํธ ๋ฃจํ
- ๋น๋๊ธฐ ์ฝ๋์ ์คํ ์์๋ฅผ ์์ธกํ ์ ์๋๊ฐ?
- ๋ง์ดํฌ๋กํ์คํฌ์ ๋งคํฌ๋กํ์คํฌ ์ฐจ์ด๋ฅผ ์๋๊ฐ?
- ๋ธ๋กํน ์ฝ๋๋ฅผ ํผํ ์ ์๋๊ฐ?
โ ์คํ ์ปจํ ์คํธ
- ํธ์ด์คํ ์ ์ดํดํ๋๊ฐ?
- var, let, const ์ฐจ์ด๋ฅผ ์๋๊ฐ?
- TDZ(Temporal Dead Zone)๋ฅผ ์๋๊ฐ?
โ ์ค์ฝํ์ ํด๋ก์
- ์ค์ฝํ ์ฒด์ธ์ ์ดํดํ๋๊ฐ?
- ํด๋ก์ ๋ฅผ ํ์ฉํ ์ ์๋๊ฐ?
- private ๋ณ์๋ฅผ ๋ง๋ค ์ ์๋๊ฐ?
โ ๋น๋๊ธฐ ์ฒ๋ฆฌ
- Promise๋ฅผ ์์ฑํ ์ ์๋๊ฐ?
- async/await๋ฅผ ์ฌ์ฉํ ์ ์๋๊ฐ?
- ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ํ๋๊ฐ?
์์ฝ
JavaScript ๋์ ์๋ฆฌ๋ฅผ ์ดํดํ๋ฉด ๋ ๋์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
๐ ํต์ฌ ํฌ์ธํธ:
- ์ฑ๊ธ ์ค๋ ๋: ํ ๋ฒ์ ํ๋์ฉ ์ฒ๋ฆฌ
- ์ด๋ฒคํธ ๋ฃจํ: ๋น๋๊ธฐ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํจ
- ์ฝ ์คํ: ํจ์ ์คํ ์์ ๊ด๋ฆฌ
- ๋ง์ดํฌ๋กํ์คํฌ ์ฐ์ : Promise๊ฐ setTimeout๋ณด๋ค ๋จผ์
- ํธ์ด์คํ : ์ ์ธ์ด ๋์ด์ฌ๋ ค์ง
- ํด๋ก์ : ๋ ์์ปฌ ํ๊ฒฝ ๊ธฐ์ต
๐ ๋น๋๊ธฐ ์ฒ๋ฆฌ ์งํ:
1๋จ๊ณ: Callback (์ฝ๋ฐฑ ์ง์ฅ ๋ฌธ์ )
2๋จ๊ณ: Promise (์ฒด์ด๋ ๊ฐ๋ฅ)
3๋จ๊ณ: Async/Await (๋๊ธฐ ์ฝ๋์ฒ๋ผ ์์ฑ)
โ ๏ธ ์ฃผ์์ฌํญ:
- ๋ฌด๊ฑฐ์ด ๋๊ธฐ ์์ ์ ํ๋ฉด์ ๋ฉ์ถค
- setTimeout(fn, 0)๋ ์ฆ์ ์คํ๋์ง ์์
- var ๋์ let/const ์ฌ์ฉ
- ํด๋ก์ ๋ก ๋ฉ๋ชจ๋ฆฌ ๋์ ์ฃผ์
๐ ์คํ ์์ ์ ๋ฆฌ:
1. ๋๊ธฐ ์ฝ๋ (์ฝ ์คํ)
2. ๋ง์ดํฌ๋กํ์คํฌ (Promise, queueMicrotask)
3. ๋ ๋๋ง (requestAnimationFrame)
4. ๋งคํฌ๋กํ์คํฌ (setTimeout, setInterval)
JavaScript๋ ์ฑ๊ธ ์ค๋ ๋์ง๋ง
์ด๋ฒคํธ ๋ฃจํ์ Web APIs ๋๋ถ์
๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
์ด ์๋ฆฌ๋ฅผ ์ดํดํ๋ฉด
์ฝ๋์ ์คํ ์์๋ฅผ ์์ธกํ๊ณ ,
ํจ์จ์ ์ธ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์์ฑํ๋ฉฐ,
๋๋ฒ๊น
๋ ํจ์ฌ ์ฌ์์ง๋ค.