์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์๋ผ๋ฉด ์์์ผํ๋ ํต์ฌ 33๊ฐ ์ด๋ก | #1. Call Stack
https://github.com/leonardomso/33-js-concepts
GitHub - leonardomso/33-js-concepts: ๐ 33 JavaScript concepts every developer should know.
๐ 33 JavaScript concepts every developer should know. - GitHub - leonardomso/33-js-concepts: ๐ 33 JavaScript concepts every developer should know.
github.com
์๋ ๊ทธ๋ฆผ์ Javasript Concurrency Model(V8 ์์ง)์ผ๋ก์จ sing call stack, heap, queue๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
๊ฐ์ฒด๋ค์ ๋๋ถ๋ถ์ ๋ฉ๋ชจ๋ฆฌ์ ๊ตฌ์กฐํ๋์ง ์์ ์์ญ๊ณผ ๊ฐ์ heap์ ์์นํ๋๋ฐ,
๋ณ์๋ ๊ฐ์ฒด๋ค์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ์ด๊ณณ์์ ์ผ์ด ๋ฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์์ ์ฒ๋ฆฌํ message ๋ชฉ๋ก, ์คํ ๊ด๋ จ ์ฝ๋ฐฑ ํจ์๊ฐ ํฌํจ๋ message queue๋ฅผ ํฌํจํฉ๋๋ค.
์คํ์ด ์ถฉ๋ถํ ์ฉ๋์ด ์์ ๋, ๋ฉ์์ง๋ฅผ ํ์์ ๊บผ๋ด์ ๊ด๋ จ ํจ์๋ฅผ ํธ์ถํ์ฌ ์งํ์ํค๊ณ (์ด๋ ๊ฒ ์ด๊ธฐ์ ์คํ ํ๋ ์์ ๋ง๋ ๋ค), ์คํ์ด ๋ค์ ๋น์ด์ง๋ฉด ๋ฉ์์ง ์ฒ๋ฆฌ๊ฐ ์ข
๋ฃ๋ฉ๋๋ค.
๊ธฐ๋ณธ ์ฉ์ด๋ก, ์ด๋ฐ ๋ฉ์์ง๋ค์ด ์ธ๋ถ ๋น๋๊ธฐ ์ด๋ฒคํธ๋ค์ ๋ํ ์๋ต, ์ฝ๋ฐฑ ํจ์๊ฐ ์ ๊ณต๋ ๊ฒฝ์ฐ์ ๋ํด ํ์
๋๋ค.(๋ง์ฐ์ค ํด๋ฆญ๋จ, HTTP request์ ์๋ต ์์ )
์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ํด๋ฆญํ๊ณ ์ฝ๋ฐฑ ํจ์๊ฐ ์๋ค๋ฉด ์ด๋ค message๋ enqueue๋์ง ์์์ ๊ฒ์
๋๋ค.
Call Stack์ ์ฌ๋ฌ ํจ์๋ค(functions)์ ํธ์ถํ๋ ์คํฌ๋ฆฝํธ์์ ํด๋น ์์น๋ฅผ ์ถ์ ํ๋ ์ธํฐํ๋ฆฌํฐ (์น ๋ธ๋ผ์ฐ์ ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ธํฐํ๋ฆฌํฐ๊ฐ์)๋ฅผ ์ํ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ํ์ฌ ์ด๋ค ํจ์๊ฐ ๋์ํ๊ณ ์๋์ง, ๊ทธ ํจ์ ๋ด์์ ์ด๋ค ํจ์๊ฐ ๋์ํ๋ ์ง, ๋ค์์ ์ด๋ค ํจ์๊ฐ ํธ์ถ๋์ด์ผํ๋ ์ง ๋ฑ์ ์ ์ดํฉ๋๋ค.
์ฆ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์คํํด์ผ ํ๋ ํจ์๋ ์คํ(stack)์ ์ฌ๋ผ๊ฐ๊ฒ ๋ฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ์ ์ธ๋ ํจ์๋ค์ ์คํ ์์ push๋ก ์ฌ๋ ค ๋๊ณ ์ฐจ๋ก๋ก ํจ์๋ฅผ ๋ค ์คํํ๋ฉด pop์ผ๋ก ์ ๊ฑฐ๋ฉ๋๋ค.
๊ทธ๋ ๊ฒ ์ฝ์คํ์ ํจ์๋ค์ด ๋ค ์คํ๋์ด ๋ค ์ ๊ฑฐ๋๋ฉด ํ๋ก๊ทธ๋จ์ ์ข ๋ฃ๋๊ฒ ๋์ฃ .
์๋ฅผ ๋ค์ด...
function foo(b) {
var a = 5;
return a * b + 10;
}
function bar(x) {
var y = 3;
return foo(x * y);
}
console.log(bar(6));
ํด๋น ์ฝ๋๋ฅผ ์คํํ๋ฉด...
์ฝ์คํ์ ์๋ gif์์์ฒ๋ผ ์คํ๋ ๋๋ง๋ค Call Stack์ ํ๋์ฉ ์์ด๊ฒ ๋๊ณ , ์ฝ์คํ์ ์์ธ console.log์ bar, foo ํจ์๊ฐ ์ฐจ๋ก๋ก ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํจ๊ณผ ๋์์ pop๋์ด Call Stack์์ ์ฌ๋ผ์ง๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ฝ ์๋ ๊ทธ๋ฆผ์ฒ๋ผ foo ํจ์์์ ๊ฐ์ ๋ก ์์ธ๋ฅผ ๋ฐ์์ํค๋ฉด stack trace๋ฅผ ์ฝ์์์ ๋ณผ ์ ์์ต๋๋ค.
๊ทธ๋ฆผ์ฒ๋ผ ์๋ฌ๋ ํ์ฌ ์ฝ์คํ์ ์ํ๋ฅผ ๋ํ๋ด์ฃผ๊ณ ํจ์์์์ ์คํ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์์์ ์๋์ ์ด๋์ด ์คํจํ ๊ฒ์ ๋ณด์ฌ์ฃผ๊ณ ์์ต๋๋ค.
๋ฐ๋ผ์ Call Stack์ ํตํด ํจ์์ ์คํ์์๋ฅผ ํ์ธํ๊ณ ์ถ์ ํ ์ ์์ต๋๋ค.
๋ฌผ๋ก ํจ์๋ฅผ ๋ฐ๋ณตํด์ ๋ฌดํ ํธ์ถํ๊ฒ ๋๋ฉด ์ ํ๋ ์คํ ์ฌ์ด์ฆ๋ก ์ธํด Max Stack Error Reached๋ก throw ์๋ฌ๋ฅผ ํ์ธํ ์ ์์ ๊ฒ ์ ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฒฝ์์ ์ฝ๋๋ฅผ ์คํํ์๋ Call Stack, Event Loop, ๊ทธ๋ฆฌ๊ณ Web APIs๊ฐ ์ด๋ค ์์ผ๋ก ๋์ํ๋์ง ์ดํด๋ณด๊ณ ์ ํฉ๋๋ค.
์๋ ์ฝ๋๋ฅผ ์คํํ๋ฉด..
setTimeout(() => {
console.log('hi')
}, 1000)
์ฝ๋๊ฐ ์คํ๋๋ฉด..
ํด๋น ์ฌ์ค์ Call Stack์ (์ฌ๊ธฐ์๋ <global>) ํธ์ํ๊ฒ ๋ฉ๋๋ค.
[code] | [call stack] | [Event Loop] | | [Web APIs] |
--------------------|-------------------|--------------| |---------------|
setTimeout(() => { | <global> | | | |
console.log('hi') | | | | |
}, 1000) | | | | |
| | | | |
๊ทธ๋ฆฌ๊ณ ๋์ ์ฝ๋์ ์ฒซ๋ฒ์งธ ๋ผ์ธ์ ์คํ์ํค๊ธฐ ์ํด setTimeout ํจ์๊ฐ Call Stack์ ๋๋ฒ์งธ ํญ๋ชฉ์ผ๋ก ๋ค์ด(ํธ์)๊ฐ๋๋ค.
[code] | [call stack] | [Event Loop] | | [Web APIs] |
--------------------|-------------------|--------------| |---------------|
> setTimeout(() => { | <global> | | | |
console.log('hi') | setTimeout | | | |
}, 1000) | | | | |
| | | | |
setTimeout์ ์คํํ๋ฉด JS๊ฐ ์๋ ์ฝ๋๊ฐ ํธ์ถ๋ฉ๋๋ค. setTimeout์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ฐ๋ฆฌ์๊ฒ ์ ๊ณตํ๋ ์น API์ ์ผ๋ถ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
[code] | [call stack] | [Event Loop] | | [Web APIs] |
--------------------|-------------------|--------------| |---------------|
> setTimeout(() => { | <global> | | | timeout, 1000 |
console.log('hi') | setTimeout | | | |
}, 1000) | | | | |
| | | | |
setTimeout์ ์คํ์ด ์๋ฃ๋๋ฉด..์์ฒญ๋ 1000ms์ ์๊ฐ ๋์ ๋๊ธฐํ Web API๋ก ์์ ์ ์คํ๋ก๋ ํฉ๋๋ค.
[code] | [call stack] | [Event Loop] | | [Web APIs] |
--------------------|-------------------|--------------| |---------------|
setTimeout(() => { | <global> | | | timeout, 1000 |
console.log('hi') | | | | |
}, 1000) | | | | |
| | | | |
Call Stack์ ๋ ์ด์ ์คํํ ๊ฒ์ด ์๋ค๋ ๊ฒ์ js๋ ์คํํ ๊ฒ์ด ์๋ค๋ ๋ป ์ ๋๋ค.
[code] | [call stack] | [Event Loop] | | [Web APIs] |
--------------------|-------------------|--------------| |---------------|
setTimeout(() => { | | | | timeout, 1000 |
console.log('hi') | | | | |
}, 1000) | | | | |
| | | | |
๊ทธ๋ฆฌ๊ณ ๋์์ผ, Web APIs๊ฐ ๊ฐ๋ํ๊ฒ ๋๊ณ , 1000ms๊ฐ ๋๋๊ฒ ๋๋ฉด ์ด๋ฒคํธ ๋ฃจํ์ ์ฝ๋๋ฅผ ์ถ๊ฐํ์ฌ JS์ ์๋ฆฝ๋๋ค.
์ด๋ฏธ ์คํ ์ค์ธ ์ฝ๋๋ฅผ ๋ฐฉํดํ ์ ์๊ธฐ ๋๋ฌธ์ Call Stack์ ์ง์ ํธ์ํ์ง ์์ผ๋ฉฐ ์ด์ํ ์ํฉ์ ๋น ์ง๊ฒ ๋ฉ๋๋ค.
์ฐธ๊ณ ๋ก ์ด๋ฒคํธ ๋ฃจํ๋ ํ๋ก์จ ๊ฐ์ฅ ๋จผ์ push๋ ํญ๋ชฉ์ด ๊ฐ์ฅ ๋จผ์ Pop ๋์ด ์ฌ๋ผ์ง๊ฒ ๋ฉ๋๋ค. (์ ์ ์ ์ถ)
[code] | [call stack] | [Event Loop] | | [Web APIs] |
--------------------|-------------------|--------------| |---------------|
setTimeout(() => { | function <---function | | |
console.log('hi') | | | | |
}, 1000) | | | | |
| | | | |
[code] | [call stack] | [Event Loop] | | [Web APIs] |
--------------------|-------------------|--------------| |---------------|
setTimeout(() => { | function | | | |
console.log('hi') | | | | |
}, 1000) | | | | |
| | | | |
> hi
๋ง์ง๋ง์ผ๋ก ์ด ํจ์์๋ ์คํํ ๋ค๋ฅธ ๋ช ๋ น์ด ์์ผ๋ฏ๋ก ํธ์ถ ์คํ์์ ์ ๊ฑฐ๋ฉ๋๋ค.
๊ทธ๋ ๊ฒ ์ฐ๋ฆฌ์ ํ๋ก๊ทธ๋จ์ ์คํ์ด ์ข ๋ฃ๋๊ฒ ๋ฉ๋๋ค.
[code] | [call stack] | [Event Loop] | | [Web APIs] |
--------------------|-------------------|--------------| |---------------|
setTimeout(() => { | | | | |
console.log('hi') | | | | |
}, 1000) | | | | |
| | | | |
> hi
WebPack์ ๊ธฐ์ด (0) | 2022.03.28 |
---|---|
๋งฅOS M1 ์ค๋ฆฌ์ฝ์์ nodeย ์ค์น์ ์๋ฌ ๋์๋ฒ (0) | 2021.10.21 |
NVM์ผ๋ก Node.js ์ค์น ๋ฐ ๋ฒ์ ๋ณ๊ฒฝ ๊ด๋ฆฌ (0) | 2021.10.11 |
javascript ๋ณ์์ ์ฃผ์ ํน์ฑ๋ค. (0) | 2021.08.16 |
๋๊ธ ์์ญ