์ด๋ฒคํธ ๋ฃจํ
JavaScript์ ๋ฐํ์ ๋ชจ๋ธ์ ์ฝ๋์ ์คํ, ์ด๋ฒคํธ์ ์์ง๊ณผ ์ฒ๋ฆฌ, ํ์ ๋๊ธฐ ์ค์ธ ํ์ ์์ ์ ์ฒ๋ฆฌํ๋ ์ด๋ฒคํธ ๋ฃจํ์ ๊ธฐ๋ฐํ๊ณ ์์ผ๋ฉฐ, C ๋๋ Java ๋ฑ ๋ค๋ฅธ ์ธ์ด๊ฐ ๊ฐ์ง ๋ชจ๋ธ๊ณผ๋ ์๋นํ ๋ค๋ฆ ๋๋ค.
๋ฐํ์ ๊ฐ๋
์ฌ๊ธฐ์๋ ์ด๋ก ์ ์ธ ๋ชจ๋ธ๋ง์ ์ค๋ช ํฉ๋๋ค. ํ๋์ ์ธ JavaScript ์์ง์ ์๋์ ๊ฐ๋ ์ ๊ตฌํํ๊ณ ๊ณ ๋๋ก ์ต์ ํํฉ๋๋ค.
์๊ฐ์ ํํ
์คํ
ํจ์์ ํธ์ถ๋ค์ 'ํ๋ ์' ์คํ์ ํ์ฑํฉ๋๋ค.
function foo(b) {
const a = 10;
return a + b + 11;
}
function bar(x) {
const y = 3;
return foo(x * y);
}
const baz = bar(7); // 42๋ฅผ baz์ ํ ๋น
์ ์ฝ๋์ ์คํ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
bar
๋ฅผ ํธ์ถํ ๋,bar
์ ์ธ์์ ์ง์ญ ๋ณ์์ ๋ํ ์ฐธ์กฐ๋ฅผ ํฌํจํ๋ ์ฒซ ๋ฒ์งธ ํ๋ ์์ด ์์ฑ๋ฉ๋๋ค.bar
๊ฐfoo
๋ฅผ ํธ์ถํ ๋,foo
์ ์ธ์์ ์ง์ญ ๋ณ์๋ฅผ ํฌํจํ๋ ๋ ๋ฒ์งธ ํ๋ ์์ด ์์ฑ๋์ด ์ฒซ ๋ฒ์งธ ํ๋ ์์ ์๋ก ์ถ๊ฐ๋ฉ๋๋ค.foo
๊ฐ ๋ฐํ๋๋ฉด, ๋งจ ์์ ํ๋ ์ ์์๋ฅผ ์คํ ๋ฐ์ผ๋ก ๊บผ๋ ๋๋ค(bar
ํธ์ถ ํ๋ ์๋ง ๋จ๊ฒ ๋ฉ๋๋ค).bar
๊ฐ ๋ฐํ๋๋ฉด, ์คํ์ด ๋น์ด์๊ฒ ๋ฉ๋๋ค.
์ธ์์ ์ง์ญ ๋ณ์๋ ์คํ ๋ฐ๊นฅ์ ์ ์ฅ๋๋ฏ๋ก, ๋ฐ๊นฅ ํจ์๊ฐ ๋ฐํ๋ ํ์๋ ๊ณ์ ์กด์ฌํ ์ ์์์ ์ ์ํ์ธ์. ์ค์ฒฉ ํจ์์์ ์ง์ญ ๋ณ์์ ์ ๊ทผํ ์ ์๋ ์ด์ ๊ฐ ์ด๊ฒ์ ๋๋ค.
ํ
๊ฐ์ฒด๋ ํ์ ํ ๋น๋ฉ๋๋ค. ํ์ ๋จ์ํ ๋ฉ๋ชจ๋ฆฌ์ ํฐ (๊ทธ๋ฆฌ๊ณ ๋๋ถ๋ถ ๊ตฌ์กฐํ๋์ง ์์) ์์ญ์ ์ง์นญํ๋ ์ฉ์ด์ ๋๋ค.
ํ
JavaScript ๋ฐํ์์ ๋ฉ์์ง ํ, ์ฆ ์ฒ๋ฆฌํ ๋ฉ์์ง์ ๋๊ธฐ์ด์ ์ฌ์ฉํฉ๋๋ค. ๊ฐ๊ฐ์ ๋ฉ์์ง์๋ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ํจ์๊ฐ ์ฐ๊ฒฐ๋์ด ์์ต๋๋ค.
์ด๋ฒคํธ ๋ฃจํ์ ์์ ์์ ์, ๋ฐํ์์ ๋๊ธฐ์ด์์ ๊ฐ์ฅ ์ค๋๋ ๋ฉ์์ง๋ถํฐ ํ์์ ๊บผ๋ด ์ฒ๋ฆฌํ๊ธฐ ์์ํฉ๋๋ค. ์ด๋ฅผ ์ํด ๋ฐํ์์ ๊บผ๋ธ ๋ฉ์์ง๋ฅผ ๋งค๊ฐ๋ณ์๋ก, ๋ฉ์์ง์ ์ฐ๊ฒฐ๋ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. ํจ์๋ฅผ ํธ์ถํ๋ฉด ํด๋น ํจ์๊ฐ ์ฌ์ฉํ ์๋ก์ด ์คํ ํ๋ ์์ด ์์ฑ๋ฉ๋๋ค.
ํจ์ ์ฒ๋ฆฌ๋ ์คํ์ด ๋ค์ ํ ๋น ๋๊น์ง ๊ณ์๋ฉ๋๋ค. ๊ทธ ํ, ํ์ ๋ฉ์์ง๊ฐ ๋จ์์์ผ๋ฉด ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ฒ๋ฆฌ๋ฅผ ๊ณ์ ์งํํฉ๋๋ค.
์ด๋ฒคํธ ๋ฃจํ
์ด๋ฒคํธ ๋ฃจํ๋ ์ด ๊ธฐ๋ฅ์ ๊ตฌํํ ๋ ๋ณดํต ์ฌ์ฉํ๋ ๋ฐฉ์์์ ๊ทธ ์ด๋ฆ์ ์ป์์ผ๋ฉฐ, ๋๋ต ๋ค์๊ณผ ๊ฐ์ ํํ์ ๋๋ค.
while (queue.waitForMessage()) {
queue.processNextMessage();
}
queue.waitForMessage()
ํจ์๋ ํ์ฌ ์ฒ๋ฆฌํ ์ ์๋ ๋ฉ์์ง๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด ์๋ก์ด ๋ฉ์์ง๊ฐ ๋์ฐฉํ ๋๊น์ง ๋๊ธฐ์ ์ผ๋ก ๋๊ธฐํฉ๋๋ค.
"Run-to-completion"
๊ฐ ๋ฉ์์ง์ ์ฒ๋ฆฌ๋ ๋ค๋ฅธ ๋ฉ์์ง์ ์ฒ๋ฆฌ๋ฅผ ์์ํ๊ธฐ ์ ์ ์์ ํ ๋๋ฉ๋๋ค.
์ด ํน์ง์ ํ๋ก๊ทธ๋จ์ ๋์์ ์ถ๋ก ํ ๋ ์ ์ฉํ ํน์ฑ์ ์ ๊ณตํฉ๋๋ค. ์คํํ ํจ์๊ฐ ๋ค๋ฅธ ์์ ์ ์ํด ์ ์ ๋ ์ผ์ด ์๊ณ , ๋ค๋ฅธ ๋ชจ๋ ์ฝ๋์ ์คํ๋ณด๋ค ์ฐ์ ํด์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ผ๋ฉฐ, ์ค๋จ๋๋ ์ผ ์์ด ์์ ํ ๋๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐ๋ฉด, ์๋ฅผ ๋ค์ด C ์ธ์ด์์๋, ์ค๋ ๋์์ ์คํ ์ค์ธ ํจ์๋ฅผ ๋ฐํ์ ์์คํ ์ด ์์๋ก ๋ฉ์ถ๊ณ ๋ค๋ฅธ ์ค๋ ๋์ ๋ค๋ฅธ ์ฝ๋๋ฅผ ๋จผ์ ์คํํ ์ ์์ต๋๋ค.
์ด ๋ชจ๋ธ์ ๋จ์ ์, ๋ง์ฝ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ ๋ ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๋ฉด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ํด๋ฆญ์ด๋ ์คํฌ๋กค๊ณผ ๊ฐ์ ์ฌ์ฉ์ ์ํธ์์ฉ์ ์ฒ๋ฆฌํ ์ ์๋ค๋ ์ ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ "์คํฌ๋ฆฝํธ ์๋ต ์์" ๋ํ์์๋ฅผ ํ์ํด์ ์ด ๋ฌธ์ ๋ฅผ ์ํํฉ๋๋ค. ๊ฐ๋ฐ์๋ก์ ์ฌ์ฉํ ์ ์๋ ์ข์ ๋ฐฉ๋ฒ์ผ๋ก๋ ๋ฉ์์ง ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ณ๊ฒ ์ ์งํ๊ณ , ๊ฐ๋ฅํ๋ค๋ฉด ํ๋์ ๋ฉ์์ง๋ฅผ ์ฌ๋ฌ ๊ฐ๋ก ๋๋๋ ๊ฒ์ ๋๋ค.
๋ฉ์์ง ์ถ๊ฐํ๊ธฐ
์น ๋ธ๋ผ์ฐ์ ์์๋, ์์ ๊ธฐ๊ฐ ๋ถ์ฐฉ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์๋ก์ด ๋ฉ์์ง๊ฐ ์ถ๊ฐ๋ฉ๋๋ค. ์์ ๊ธฐ๊ฐ ์์ผ๋ฉด, ์ด๋ฒคํธ๋ ์ ์ค๋ฉ๋๋ค. ์ฆ, ํด๋ฆญ ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ๊ฐ ๋ถ์ ์์๋ฅผ ํด๋ฆญํ๋ฉด ๋ฉ์์ง๊ฐ ์๋ก ์ถ๊ฐ๋๋ ์์ ๋๋ค. ๋ค๋ฅธ ์ด๋ฒคํธ์ ๋ํด์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
setTimeout
ํจ์๋ ๋ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง๋๋ค. ์ฒซ ๋ฒ์งธ๋ ํ์ ์ถ๊ฐํ ๋ฉ์์ง, ๋ ๋ฒ์งธ๋ ์๊ฐ ๊ฐ(์ ํ ์ฌํญ, ๊ธฐ๋ณธ ๊ฐ 0
)์
๋๋ค. ์๊ฐ ๊ฐ์ ๋ฉ์์ง๋ฅผ ํ์ ์ถ๊ฐํ๊ธฐ๊น์ง ๊ธฐ๋ค๋ฆด (์ต์) ์ง์ฐ ์๊ฐ์ ๋ํ๋
๋๋ค. ํ์ ๋ค๋ฅธ ๋ฉ์์ง๊ฐ ์๊ณ ์คํ์ด ๋น์ด์๋ค๋ฉด setTimeout
์ ๋ฉ์์ง๋ ๋๋ ์ด ์งํ ์ฆ์ ์ฒ๋ฆฌ๋ฉ๋๋ค. ๊ทธ๋ฌ๋, ๋ค๋ฅธ ๋ฉ์์ง๊ฐ ์กด์ฌํ๋ค๋ฉด setTimeout
์ ์์ ๋ฉ์์ง์ ์ฒ๋ฆฌ๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค. ๊ทธ๋์ ๋ ๋ฒ์งธ ๊ฐ์ ์ ํํ ์ง์ฐ์๊ฐ์ด ์๋, '์ต์' ์ง์ฐ ์๊ฐ๋ง ๋ํ๋
๋๋ค.
๋ค์์ setTimeout
์ด ํ์ด๋จธ ๋ง๋ฃ ์งํ ์ฆ์ ์คํ๋์ง ์๋ ์์ ์
๋๋ค.
const seconds = new Date().getTime() / 1000;
setTimeout(function () {
// "2"๋ฅผ ์ถ๋ ฅ, ์ฆ 500๋ฐ๋ฆฌ์ด๊ฐ ์ง๋ ํ ์ฆ์ ์คํ๋ ๊ฒ์ด ์๋๋ผ๋ ๊ฒ
console.log(`${new Date().getTime() / 1000 - seconds}์ด ํ ์คํ๋ฉ๋๋ค.`);
}, 500);
while (true) {
if (new Date().getTime() / 1000 - seconds >= 2) {
console.log("์ข์์, 2์ด๊ฐ ๋ฐ๋ณตํ์ต๋๋ค.");
break;
}
}
0์ ์ง์ฐ ์๊ฐ
0์ ์ง์ฐ ์๊ฐ์ ์ง์ ํ๋ ๊ฒ์ด ์ฝ๋ฐฑ์ 0๋ฐ๋ฆฌ์ด ํ์ ํธ์ถํ๋ค๋ ๋ป์ ์๋๋๋ค. setTimeout
์ ์ง์ฐ ์๊ฐ์ 0
๋ฐ๋ฆฌ์ด๋ฅผ ์ง์ ํ๊ณ ํธ์ถํ๋๋ผ๋ ์ฝ๋ฐฑ ํจ์๋ ์ฆ์ ์คํ๋์ง ์์ต๋๋ค.
์ค์ ์คํ ์์ ์ ํ์์ ๋๊ธฐ ์ค์ธ ์์
์ ์์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. ์๋ ์์ ์์๋ 'ํ๋ฒํ ๋ฉ์์ง'
๊ฐ ์ฝ๋ฐฑ์ ํธ์ถ๋ณด๋ค ์์ ์ฝ์์ ๊ธฐ๋ก๋ ๊ฒ์
๋๋ค. ์ง์ฐ ์๊ฐ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ ์ ๋๊ธฐํ '์ต์' ์๊ฐ์ด๊ณ , ๋ณด์ฅ ์๊ฐ์ด ์๋๊ธฐ ๋๋ฌธ์
๋๋ค.
setTimeout
์ ํน์ ์ง์ฐ ์๊ฐ์ ์ง์ ํ๋๋ผ๋, ํ์์ ๋๊ธฐ ์ค์ธ ๋ชจ๋ ๋ฉ์์ง์ ์ฒ๋ฆฌ๋ ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค.
(function () {
console.log("์์");
setTimeout(function cb() {
console.log("์ฝ๋ฐฑ 1: ์ฝ๋ฐฑ ๋ฉ์์ง");
}); // has a default time value of 0
console.log("ํ๋ฒํ ๋ฉ์์ง");
setTimeout(function cb1() {
console.log("์ฝ๋ฐฑ 2: ์ฝ๋ฐฑ ๋ฉ์์ง");
}, 0);
console.log("์ข
๋ฃ");
})();
(() => {
console.log("์์");
setTimeout(() => {
console.log("์ฝ๋ฐฑ 1: ์ฝ๋ฐฑ ๋ฉ์์ง");
}); // ๊ธฐ๋ณธ์ ์ผ๋ก ์๊ฐ ๊ฐ์ 0์ผ๋ก ๊ฐ์ง๋๋ค.
console.log("this is just a message");
setTimeout(() => {
console.log("์ฝ๋ฐฑ 2: ์ฝ๋ฐฑ ๋ฉ์์ง");
}, 0);
console.log("this is the end");
})();
// "์์"
// "ํ๋ฒํ ๋ฉ์์ง"
// "์ข
๋ฃ"
// "์ฝ๋ฐฑ 1: ์ฝ๋ฐฑ ๋ฉ์์ง"
// "์ฝ๋ฐฑ 2: ์ฝ๋ฐฑ ๋ฉ์์ง"
๋ค์์ ๋ฐํ์ ๊ฐ ํต์
์น ์์ปค๋ ๊ต์ฐจ ์ถ์ฒ iframe
์ ์์ ๋ง์ ์คํ, ํ, ๋ฉ์์ง ํ๋ฅผ ๊ฐ์ง๋๋ค. ์๋ก ๋ค๋ฅธ ๋ ๋ฐํ์์ postMessage
๋ฉ์๋๋ฅผ ํตํด ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ๋ฐฉ์์ผ๋ก๋ง ์๋ก ํต์ ํ ์ ์์ต๋๋ค. ์๋๊ฐ message
์ด๋ฒคํธ๋ฅผ ์์ ํ๊ณ ์์ ๋, postMessage
๋ ์๋ ๋ฐํ์์ ๋ฉ์์ง๋ฅผ ์ถ๊ฐํฉ๋๋ค.
๋ ผ ๋ธ๋กํน
๋ค๋ฅธ ๋ง์ ์ธ์ด์ ๋ฌ๋ฆฌ JavaScript๋ ์ ๋ ๋ธ๋กํน ์ฐ์ฐ์ ํ์ง ์์ต๋๋ค. ๋ ผ ๋ธ๋กํน์ ์ด๋ฒคํธ ๋ฃจํ ๋ชจ๋ธ์ ๋ฌด์ฒ ํฅ๋ฏธ๋ก์ด ํน์ง์ผ๋ก, ๋๋ถ๋ถ์ ์ ์ถ๋ ฅ ์ฒ๋ฆฌ๊ฐ ์ด๋ฒคํธ์ ์ฝ๋ฐฑ์ ํตํด ์ํ๋๋ฏ๋ก, ์ ํ๋ฆฌ์ผ์ด์ ์ด IndexedDB ์ง์๋ XHR ์์ฒญ์ ๋ฐํ์ ๋๊ธฐ ์ค์ด๋๋ผ๋, ์ฌ์ ํ ์ฌ์ฉ์ ์ ๋ ฅ ๋ฑ ๋ค๋ฅธ ๊ฒ๋ค์ ์ฒ๋ฆฌํ ์ ์๋ ๊ฒ์ ๋๋ค.
alert
์ด๋ ๋๊ธฐ์ XHR๊ณผ ๊ฐ์ ๋ ๊ฑฐ์ ์์ธ๊ฐ ์กด์ฌํ๊ธด ํ์ง๋ง ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ฌผ๋ก ์์ธ์ ๋ํ ์์ธ๋ ์กฐ์ฌํ์ธ์(๊ทธ๋ฌ๋ ์ด๋ฐ ์์ธ๋ ๊ตฌํ์ฒด์ ๋ฒ๊ทธ์ธ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค).