May 06, 2021
์ผ๋ง์ ์ธํฐ๋ทฐ๋ฅผ ํ๋ฉด์ ๋ฐ์ ์ง๋ฌธ์ด ์์๋ค.
์ด๋ฒคํธ ๋ฃจํ์ ๊ด๋ จ๋ ์ธํฐ๋ทฐ๋ฅผ ํ๋ฉด์ ๋ฐ์ ์ง๋ฌธ์ด์๋๋ฐ,
setTimeout(() => {
console.log('์คํ')
}, 60์ด)
setTimeout
์ ๋ฑ 60์ด๋ค์ ๋ฌด์กฐ๊ฑด ์คํ๋๋์?
๋ด๊ฐ ๋๋ตํ ๋ต๋ณ์
์๋์
์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธ์ค๋ ๋์ด๋ค. ํ๋์ ์์
์์ญ์ธ Stack
์ ์์
์ด ์์ด๊ณ , ์ ์
ํ์ถ์ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ๊ฐ ๋๋ค.
๊ทธ ์ค์์๋ setTimeout
, Promise
, Callbackํจ์
๋ฑ์ ๋น๋๊ธฐ webApi
๋ค์ ํธ์ถ์ด ๋๋ฉด, ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ญ์์ ํ์ํ ์๊ฐ ํน์ ์ง์ ๋ ์๊ฐ์ด ์๋ชจ๋ ํ Que
์๋ฃ๊ตฌ์กฐ์ ์ดํ์ ์ฝ๋ฐฑํจ์๋ค์ด ๋ด๊ธฐ๊ฒ ๋๋ค.
๊ฐ๊ฐ์ task
, microTask
์ ์๋ฃ๊ตฌ์กฐ์ ๋ด๊ธฐ๊ฒ ๋๊ณ , Promise
์ ์ฝ๋ฐฑํจ์๊ฐ ๋ด๊ธฐ๋ microTask
์ Que
์๋ฃ๊ตฌ์กฐ๊ฐ ์ ์
์ ์ถ์ ๋ฐฉ์์ผ๋ก task
๋ณด๋ค ๋จผ์ ์คํ๋๋ค.
์ด๋ ๊ฒ ๋ฉ์ธ์ค๋ ๋๊ฐ ๋น์ด์์์ ๊ฐ์งํ๋ค์ ๋ค์ que
์ ์์
์ ์ํด ์ฐ์ ์์๋ฅผ ํ๋ณํ๊ณ ์์
์ ์ฎ๊ฒจ์ฃผ๋๊ฒ์ด EventLoop
์๋ค.
๋ด๊ฐ ์๊ธฐ๋ก ์ด๋ ๋ค..
๋ฐ๋ผ์, ์ฐ์ ์์์์ ๋ฐ๋ฆฌ๊ฒ๋๊ฑฐ๋, ์ฌ๋ฌ๊ฐ์ ์์
์ด que
์ ์ค์ฒฉ์ด๋๊ฒ ๋๋ค๋ฉด, ์ด๋ค ๊ฒฝ์ฐ๋ ์ง์ ๋ ์๊ฐ์ ๋ฑ ์ํ๋์ง๋ ์์๊ฒ ๊ฐ๋ค ๋ผ๋ ๋ต์ ํ์๋ค.
๋น์ฐํ ์ธํฐ๋ทฐ์์ ๋์ ๋ต๋ณ์ด ์ ๋ต์ธ์ง ์๋์ง๋ ์๊ธฐํด์ฃผ์์ง ์์๋ค.
๊ทธ๋์ ๊ถ๊ธ์ฆ์ ํ๋ฒ ์คํ์ ํด๋ณด์๋ค.
์ฐธ๊ณ ๋ก ์ด ์คํ์ ์ ํ์ฑ์ ์ ๋ก์ ๋๋ค. ๊ทนํ ์ฃผ๊ด์ ์ธ ์๊ฐ์ด ๋ด๊ฒจ์์ต๋๋ค.
setTimeout(() => {
console.log(`์ฒซ๋ฒ์งธ setTimeout ์คํ์๊ฐ : ${new Date().getTime()}`)
}, 0)
setTimeout(() => {
console.log(`๋๋ฒ์งธ setTimeout ์คํ์๊ฐ : ${new Date().getTime()}`)
}, 0)
console.log(`์คํฌ๋ฆฝํธ๊ฐ ์ฝํ ์๊ฐ : ${new Date().getTime()}`)
setTimeout
์ ๋ชจ๋ 0์ด ๋ค์ ์คํ๋๋๋ก ํ๋ฉฐ, ์คํํ ๋ ์คํ๋ ์๊ฐ์ ์๋ ค์ค๋ค.
์ฃผ๊ด์ ์ผ๋ก 0์ด๋ฉด ์ฌ์ฉ์์ ์ ์ฅ์์ ์ฆ์์คํ์ด๋ ๋ค๋ฆ์๋ค๊ณ ์๊ฐํ์์. ๋ฌผ๋ก , ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ์๋๊ฒ ์ง๋ง
setTimeout
์ ํตํด, ๋๊ฐ์ 0์ด๋ฅผ ์ง์ ํ์ ๋, ์คํ์๊ฐ์ ์ฐจ๋ฅผ ํ์ธํ๊ณ ์ ํจ.
๋ง์ฝ, ๋๊ฐ์ ์คํ์๊ฐ์ด ๋ค๋ฅด๋ค๋ฉด ๋ฌด์กฐ๊ฑด ์ ํด์ง ์๊ฐ(0์ด) ๋ค์ ์คํ๋๋ค๋ ๋ณด์ฅ์ ์๋ค๊ณ ์๊ฐ๋จ
setTimeout
์ด ์คํ๋ ์๊ฐ์ด ๋ค๋ฅด๋ค๋ฉด ์ฒซ setTimeout
๋ํ, ๋ฐ๋ก์คํ(0์ด ๋ค ์คํ)์ด ์๋๋ผ๊ณ ์๊ฐ๋จApi
๋ ๋ฉ์ธ์ค๋ ๋๊ฐ ์๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ณ๋๋ก ์คํ๋ ํ, ๋ฉ์ธ์ค๋ ๋์์ ๋ชจ๋ ์์
์ด ์๋ฃ๋ ๋ค์ ์ฝ๋ฐฑํจ์๊ฐ ์คํ๋๋ค๋ ์ ์์ ๋ฆ๊ฒ ํธ์ถ๋๋ค๋๊ฒ์ ๋น์ฐํ์ง๋ง, ์ฌ์ฉ์์ ์
์ฅ์์ 0์ด๋ ์ฌ์ค ์ฆ์๋ผ๋๊ฒ์ ์๊ฐํ๊ณ ํ
์คํธํ์์.๋ชจ๋ ์๊ฐ์ด ๋ค๋ฅด๋ค๋ ๊ฒฐ๊ณผ๊ฐ ๋์ด.
์ฌ์ค ์ฌ๋ฌ๋ฒ ์๋ก๊ณ ์นจํด์ ๋์จ ๊ฒฐ๊ณผ๊ธด ํ๋ค. ํ์ง๋ง, ์ ์ด์ ์ ๋ ๋ผ๋ ์์์ด๊ฐ ๋ถ์ ์์ ์์ ๋จ ํ๋ฒ์ ์์ธ์ ์ธ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋๋ผ๋ ๊ทธ ์๋ฏธ๋ ํด์๋๋๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์๊ด์๋ค๊ณ ๋ณธ๋ค.
์ฆ, setTimeout
์ ์ง์ ๋ ์๊ฐ์ ๋ฌด์กฐ๊ฑด์ ์ผ๋ก ์คํ๋๋๊ฒ์ด ์๋๋ผ, ์ํฉ์ ๋ฐ๋ผ ์๊ฐ์ด ์กฐ๊ธ ๋ฐ๋ฆด ์ ์๋ค๋ ์ .
MDN
์์ setTimeout
๊ณผ ๊ด๋ จํ์ฌ ํ์ธํ ์ ์๋ ๊ธ์ด ์์๋ค.
์คํ์ que
์ ๋๊ธฐ์ค์ธ ์์
์์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. ์๋ํ๋ฉด ์ง์ฐ(delay
)์ ๋ณด์ฅ๋ ์๊ฐ์ด ์๋๋ผ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ํ์ํ ์ต์์ ์๊ฐ์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก setTimeout
์ setTimeout
์ ๋ํ ํน์ ์๊ฐ ์ ํ์ ์ง์ ํ๋๋ผ๋ ๋๊ธฐ์ค์ธ ๋ฉ์์ง์ ๋ชจ๋ ์ฝ๋๊ฐ ์๋ฃ ๋ ๋๊น์ง ๋๊ธฐํด์ผํฉ๋๋ค.
setTimeout
์ ์ง์ ๋ ์๊ฐ์ ์ฝ๋ฐฑํจ์๊ฐ ์ค์ง์ ์ผ๋ก ํธ์ถ๋๋ ์ง์ฐ์๊ฐ์ด ์๋๋ผ, ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ํ์ํ ์ต์์ ์๊ฐ์ด๋ฉฐ, que
์ ์ค์ฒฉ๋ ์ฌ๋ฌ ์์
๊ณผ ๊ฐ์ด ์ํฉ์ ๋ฐ๋ผ ๋๊ธฐ์๊ฐ์ผ๋ก ์ธํด ์ง์ฐ๋ ์ ์๋ค.
์๋ง
Promise
์ ๊ฐ์ ๋น๋๊ธฐApi
๋ค๋ ๋น์ทํ ๊ฒฐ๊ณผ์ผ ๊ฒ ๊ฐ๋ค.
์ด์ฒ๋ผ ์ต๋ํ ์์๋ ์๊ฐ์ ๊ฒฐ๊ณผ๋ฌผ์ ํ์ธํ ์ ์๋๋ก debounce
์ throttle
์ ํตํด ๋น๋๊ธฐํจ์๋ค์ด ์ค์ฒฉ๋๋๊ฒ์ ์ ์ดํ๋๊ฒ์ด ์๋๊ฐ ์ถ๋ค.
๋ต๋ณ์ ์ ํ๊ฑฐ๊ฒ ์ง?