์ผ๋ง ์ GitHub์ ์๋ 33 Concepts Every JavaScript Developer Should Know ๋ผ๋ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์๊ฒ ๋์๋ค.
๋ชจ๋ ๋ช
ํํ๊ฒ ์์์ผ ํ ๊ฐ๋
๋ค์ธ๋ฐ ๋ชจ๋ฅด๋ ๊ฒ๋ ๋ง๊ณ , ์ค๋ช
ํด๋ณด๋ผ๊ณ ํด๋ ๋ชปํ ๋ด์ฉ๋ค์ด ๋๋ฌด ๋ง์์ ์กฐ๊ธ์ฉ ๊ณต๋ถํด๋ณด๊ธฐ๋ก ํ๋ค.
๊ทธ์ค ์ฒซ ๋ฒ์งธ ํธ์ถ ์คํ๊ณผ ๊ด๋ จ๋ ๋ด์ฉ์์ ๋ช ๊ฐ์ง ์ํฐํด์ ์ฝ์ด๋ณด์๊ณ ๋ด๊ฐ ์ ๋ฆฌํ ๊ฒธ ๊ธฐ์ตํ ๊ฒธ ๋ฒ์ญ๊ธ์ ์์ฑํด๋ณด๋ ค๊ณ ํ๋ค.
โป ๋ด๋ณด๋ด๋ฒ(๋ด๊ฐ ๋ณด๋ ค๊ณ ๋ด๊ฐ ๋ฒ์ญํ): ์์ด ์ ๊ณต์๋ ํด์ธ ์ ํํ๋ ์๋๊ธฐ์ ๋ฒ์ญ์๋ ์์ญ, ์ค์ญ, ๊ตฌ๊ธ ๋ฒ์ญ์ด ๋ฌด์ํ ๋ง์ ์ ์์ผ๋ฉฐ, ์คํ๋ ๋ง์ ์ ์๋ค. ์ ํํ ๋ด์ฉ์ ์๋ฌธ์ ์ง์ ์ดํด๋ณด๊ฑฐ๋ ๋ค๋ฅธ ์ ๋ณด๋ค์ ๋ ์ฐพ์๋ณด๋ ๊ฒ์ ์ถ์ฒํ๋ค.
(ํ์ง๋ง ๋๊ธ ํผ๋๋ฐฑ๋ ํ์ํฉ๋๋ค๐ )
์ด๋ฒ์ ๊ณ ๋ฅธ ์ํฐํด์ Valentino Gagliardi ๋์ด ์์ฑํ์ Javascript: What Is The Execution Context? What Is The Call Stack?์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ: ์คํ ์ปจํ ์คํธ๋? ํธ์ถ ์คํ์ด๋?
Javascript์์ ์คํ ์ปจํ ์คํธ๋ ๋ฌด์์ธ๊ฐ?
๋ด๊ฐ ์ฅ๋ดํ๋๋ฐ ๋น์ ์ ์ด ๋ต์ ๋ชจ๋ฅธ๋ค.
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๊ฐ์ฅ ๊ธฐ์ด์ ์ธ ์์๋ค์ ๋ฌด์์ธ๊ฐ?
๋ณ์์ ํจ์์ด์ง ์์๊ฐ? ๋ชจ๋๊ฐ ์ด๋ฌํ ๊ตฌ์ฑ ์์๋ค์ ๋ฐฐ์ธ ์ ์๋ค.
ํ์ง๋ง ๊ทธ ๊ธฐ๋ณธ ์๋์ ๊น๋ ค์๋ ๊ฒ์ ๋ฌด์์ธ๊ฐ?
์๊ธฐ ์์ ์ ์ค๊ธ (ํน์ ์๋์ด๊น์ง๋) ๊ฐ๋ฐ์๋ผ๊ณ ๋ถ๋ฅด๊ธฐ ์ ์ ๋ง์คํฐํด์ผ ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ธฐ๋ฅ๋ค์ ๋ฌด์์ธ๊ฐ?
๋ง์ด ์๋๋ฐ, ์ค์ฝํ, ํด๋ก์ , ์ฝ๋ฐฑ, ํ๋กํ ํ์
๋ฑ์ด ์๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋ฌํ ๊ฐ๋
๋ค์ ๋ ๊น์ด ํ๊ณ ๋ค๊ธฐ ์ ์ ์ ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ด๋ป๊ฒ ๋์ํ๋์ง ์ดํดํด์ผ ํ๋ค.
์ด ํฌ์คํธ์์ ์ฐ๋ฆฌ๋ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ ๊ฐ์ง ๊ธฐ์ด์ ์ธ ์์๋ค์ ๋ํด์ ์ดํด๋ณผ ๊ฒ์ด๋ค: ์คํ ์ปจํ
์คํธ(Execution Context)์ ํธ์ถ ์คํ(Call Stack)์ด๋ค.
(๋๋ ค์ํ์ง ๋ง๋ผ. ์๊ฐ๋ณด๋ค ์ฌ์ธ ํ
๋๊น)
์ค๋น๋๋?
์ด ์๋ฃ๋ค์ ๋์ ๊ณ ๊ธ ์๋ฐ์คํฌ๋ฆฝํธ ํด๋์ค(์๊ฒฉ 1:1 ํธ๋ ์ด๋๊ณผ ์ ๋ฝ ํ์ฅ ํธ๋ ์ด๋)์ ์ผ๋ถ๋ถ์ด๋ค.
๋ชฉ์ฐจ
1. ์๋ฐ์คํฌ๋ฆฝํธ: ์คํ ์ปจํ ์คํธ๋? ๋ฌด์์ ๋ฐฐ์ธ ๊ฒ์ธ๊ฐ
2. ์๋ฐ์คํฌ๋ฆฝํธ: ์คํ ์ปจํ ์คํธ๋? ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋น์ ์ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์คํ์ํค๋๊ฐ?
3. ์๋ฐ์คํฌ๋ฆฝํธ: ์คํ ์ปจํ ์คํธ๋? ์๋ฐ์คํฌ๋ฆฝํธ ์์ง
4. ์๋ฐ์คํฌ๋ฆฝํธ: ์คํ ์ปจํ ์คํธ๋? ์ด๋ป๊ฒ ๋์ํ๋๊ฐ?
5. ์๋ฐ์คํฌ๋ฆฝํธ: ์คํ ์ปจํ ์คํธ๋? ์ ์ญ ๋ฉ๋ชจ๋ฆฌ
6. ์๋ฐ์คํฌ๋ฆฝํธ: ์คํ ์ปจํ ์คํธ๋? ํธ์ถ ์คํ์ด๋?
7. ์๋ฐ์คํฌ๋ฆฝํธ: ์คํ ์ปจํ ์คํธ๋? ์ง์ญ ์คํ ์ปจํ ์คํธ
8. ์๋ฐ์คํฌ๋ฆฝํธ: ์คํ ์ปจํ ์คํธ๋? ํธ์ถ ์คํ์ด๋? ์ ๋ฆฌ
์๋ฐ์คํฌ๋ฆฝํธ: ์คํ ์ปจํ ์คํธ๋? ๋ฌด์์ ๋ฐฐ์ธ ๊ฒ์ธ๊ฐ
์ด ํฌ์คํธ์์ ์๋์ ๋ด์ฉ์ ๋ํด ๋ฐฐ์ธ ๊ฒ์ด๋ค:
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ด๋ป๊ฒ ๋์ํ๋์ง
- ์๋ฐ์คํฌ๋ฆฝํธ์ ์คํ ์ปจํ ์คํธ
- ํธ์ถ ์คํ์ ๋ฌด์์ธ๊ฐ
- ์ ์ญ ์คํ ์ปจํ ์คํธ์ ์ง์ญ ์คํ ์ปจํ ์คํธ์ ์ฐจ์ด์
์๋ฐ์คํฌ๋ฆฝํธ: ์คํ ์ปจํ ์คํธ๋? ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋น์ ์ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์คํ์ํค๋๊ฐ?
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ด๋ป๊ฒ ๋น์ ์ ์ฝ๋๋ฅผ ๋์์ํค๋๊ฐ?
๋น์ ์ด ์๋์ด ๊ฐ๋ฐ์๋ผ๋ฉด ๋ต์ ์ด๋ฏธ ์๊ณ ์์์ง๋ ๋ชจ๋ฅธ๋ค.
๋น์ ์ด ์ด๋ณด์๋ผ๋ฉด ํจ๊ป ์ดํด๋ณด์.
์ฌ์ค ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ด๋ถ๋ ์ฝ์ง ์๋ค.
ํ์ง๋ง ๋น์ ์ด ๋ฐฐ์ธ ์ ์๋ค๊ณ ๋ณด์ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ๋ค์ ๋ฐฐ์๊ฐ๋ฉด์ ์์ ๊ฐ์ ๋๋ผ๊ณ ๋ ๋๋ํด์ก๋ค๊ณ ๋๋ ๊ฒ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ด๋ถ ๋์์ ์ดํด๋ณด๋ฉด ํ๋ํ๋ ์ธ์ธํ ๊ฒ๊น์ง ๋ง์คํฐํ์ง ๋ชปํ๋ค๊ณ ํด๋ ๋ ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์ ๋ ์ ์๋ค.
๊ทธ๋ผ ์ด์ , ์๋์ ์ฝ๋๋ฅผ ์ดํด๋ณด์:
var num = 2;
function pow(num) {
return num * num;
}
๋ค ๋ดค๋๊ฐ?
๊ทธ๋ ๊ฒ ์ด๋ ค์ ๋ณด์ด์ง ์๋๋ค.
์ด์ ํ๋ฒ ์๊ธฐ ํด๋ณด์: ๋น์ ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ ํ ์์๋ก ์ด ์ฝ๋๋ฅผ ํ๊ฐํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋๊ฐ?
๋ค์ ๋งํ๋ฉด, ๋น์ ์ด ๋ธ๋ผ์ฐ์ ๋ผ๋ฉด, ์ด ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์ฝ์ ๊ฒ์ธ๊ฐ?
์ฌ์ด ๊ฒ ๊ฐ์ง ์๋?
๋๋ถ๋ถ์ ์ฌ๋๋ค์ "์, ๋ธ๋ผ์ฐ์ ๊ฐ pow ํจ์๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ ๋ค์, num์ 2๋ฅผ ํ ๋นํ์ง"๋ผ๊ณ ์๊ฐํ๋ค.
๋ด ํ์๋ค์ ๋๋ต์ ๋ค์ด๋ณด๊ณ ์ถ์๊ฐ?
์์์ ์๋๋ก
๋ธ๋ผ์ฐ์ ๋ ํจ์ pow์์ ์์ํด์ num * num์ ๊ณ์ฐํ๋ค.
JS์์ง์ ์ฝ๋๋ฅผ ํ ์ค ํ ์ค ์คํํ ๊ฒ์ด๋ค.
์์ํ๊ธด ํ๋ค.
๋๋ ๋ช ๋
์ ์๋ ๋๊ฐ์ด ๋งํ์๋ค.
๋ค์ ๋ถ๋ถ์์ ๋น์ ์ ๋จ์ํ ๋ช ์ค์ ์ฝ๋๋ค ๋ค์ ์๋ ์์คํ
, ๊ธฐ๊ณ์ ๋ํด์ ์ดํด๋ณผ ๊ฒ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ: ์คํ ์ปจํ ์คํธ๋? ์๋ฐ์คํฌ๋ฆฝํธ ์์ง
๋น์ ์ ํ๊ท ์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์๊ฐ ๋๊ณ ์ถ์๊ฐ?
๋ถ๋ช
๊ทธ๋ ์ง ์์ ๊ฒ์ด๋ค.
๋ง์ฝ ์๋ฐ์คํฌ๋ฆฝํธ ์ธํฐ๋ทฐ์์ ์ข์ ์ธ์์ ์ฃผ๊ธฐ๋ฅผ ์ํ๋ค๋ฉด ์ ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋น์ ์ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์คํํ๋์ง ์์์ผ ํ๋ค.
(๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์๋ ๋ค๋ฃจ์ง ์์ ๋ค๋ฅธ ๋ง์ ๊ฒ๋ค๋)
์ด๋ฌํ ๊ฐ๋
๋ค์ ๋ํด์ ์๋๋ฅด์ง ๋ง๋ผ.
๋ชจ๋ ๊ฒ์ ํ๋ฃจ ์์ ๋ค ๋ฐฐ์ธ ์ ์๋ค. ์๊ฐ์ด ๊ฑธ๋ฆด ๊ฒ์ด๋ค.
์ข์ ์์์ด ์๋ค๋ฉด ๋ด๊ฐ ๋ชจ๋๊ฐ ์ดํดํ ์ ์๋๋ก ํด์ค ๊ฒ์ด๋ค. (์ ์ด๋ ๋
ธ๋ ฅ์ ํ๊ฒ ๋ค.)
์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋น์ ์ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์คํํ๋์ง๋ฅผ ์ดํดํ๋ ค๋ฉด ์ฒซ ๋ฒ์งธ๋ก ๋ฌด์์ด ๊ฒ๊ณผ ๋ง์ฃผํด์ผ ํ๋ค:
์คํ ์ปจํ
์คํธ ์จ์ด๋ค. (mister Execution Context)
์๋ฐ์คํฌ๋ฆฝํธ์์ ์คํ ์ปจํ
์คํธ๋ ๋ฌด์์ธ๊ฐ?
๋ธ๋ผ์ฐ์ (ํน์ Node)์์ ๋งค๋ฒ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ๋ ์์ง์ ์ผ๋ จ์ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
์ด ๊ณผ์ ๋ค ์ค ํ๋๋ ์ ์ญ ์คํ ์ปจํ
์คํธ(Global Execution Context)์ ์์ฑ๊ณผ ๊ด๋ จ์ด ์๋ค.
์ ๊น ๋ฐ๋ ํฐ๋
ธ, ์์ง์ด ๋ญ์ง?
์์ง์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์คํํ๋ "์์ง"์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด๋ค.
์์ฆ์ ๋ ๊ฐ์ง ์ ๋ช
ํ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์๋ค: ๊ตฌ๊ธ V8๊ณผ ์คํ์ด๋๋ชฝํค์ด๋ค.
V8์ ๊ตฌ๊ธ์ ์คํ ์์ค ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ผ๋ก ๊ตฌ๊ธ ํฌ๋กฌ๊ณผ Node.js์ ์ฌ์ฉ๋๋ค.
์คํ์ด๋๋ชฝํค๋ Mozilla์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ผ๋ก ํ์ด์ดํญ์ค์ ์ฌ์ฉ๋๋ค.
์ด์ ์ฐ๋ฆฌ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง๊ณผ ์คํ ์ปจํ
์คํธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ง๊ธ๋ถํฐ๋ ์ด๋ค์ด ์ด๋ป๊ฒ ๊ฐ์ด ๋์ํ๋์ง ์์๋ณผ ์๊ฐ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ: ์คํ ์ปจํ
์คํธ๋? ์ด๋ป๊ฒ ๋์ํ๋๊ฐ?
์์ง์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์คํํ ๋๋ง๋ค ์ ์ญ ์คํ ์ปจํ
์คํธ๋ฅผ ์์ฑํ๋ค.
์คํ ์ปจํ
์คํธ๋ ๋น์ ์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ ํ๊ฒฝ์ ์ค๋ช
ํ๋ ๊ณ ๊ธ ์ดํ์ด๋ค.
์ด๋ฌํ ์ถ์์ ์ธ ๊ฒ๋ค์ ์๊ฐํํ๊ธฐ ์ด๋ ต๋ค. ๊ทธ ์ฌ์ ์ดํดํ๋ค.
์ด์ ์ ์ญ ์คํ ์ปจํ
์คํธ๋ฅผ ์์๋ผ๊ณ ์๊ฐํด๋ณด์:
// ์ฒจ๋ถ๋์ด์๋ ๊ทธ๋ฆผ์ด ๊นจ์ง
์ฐ๋ฆฌ์ ์ฝ๋๋ฅผ ๋ค์ ํ๋ฒ ๋ณด์:
var num = 2;
function pow(num) {
return num * num;
}
์์ง์ ์ด ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์ฝ๋๊ฐ?
์ฌ๊ธฐ ๊ฐ๋ตํ ๋ฒ์ ์ด ์๋ค:
์์ง: ๋ผ์ธ 1. ๋ณ์๊ฐ ์๋ค! ์ข์. ๋ณ์๋ฅผ ์ ์ญ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ์.
์์ง: ๋ผ์ธ 3. ํจ์ ์ ์ธ์ด ๋ณด์ด๋๋ฐ. ์ข์. ํจ์๋ ์ ์ญ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ์.
์์ง: ๋๋ ๊ฑฐ ๊ฐ์๋ฐ.
๋ธ๋ผ์ฐ์ ๊ฐ ์ฝ๋๋ค์ ์ด๋ป๊ฒ "๋ณด๋๋๊ณ " ๋ค์ ๋ฌผ์ด๋ณธ๋ค๋ฉด ์ด๋ป๊ฒ ๋๋ตํ๊ฒ ๋๊ฐ?
์, ์ผ์ข
์ ์์์ ์๋๋ก ๋ด๋ ค์ค๋ ๊ฑฐ๊ธด ํ์ง๋ง...
๋ณด๋ค์ํผ ์์ง์ pow ํจ์๋ฅผ ์คํํ์ง ์๋๋ค.
์ด๊ฒ์ ํจ์ ์ ์ธ์ด์ง ํจ์ ํธ์ถ์ด ์๋๋ค.
์์ ์ฝ๋๋ ๋ช๋ช ๊ฐ์ผ๋ก ์ ์ญ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๊ฒ์ด๋ค: ํจ์ ํ๋ ๊ทธ๋ฆฌ๊ณ ๋ณ์ ํ๋.
์ ์ญ ๋ฉ๋ชจ๋ฆฌ?
๋ฐ๋ ํฐ๋
ธ, ์ด๋ฏธ ์คํ ์ปจํ
์คํธ๋ก ํท๊ฐ๋ฆฌ๋๋ฐ ์ด์ ์ ์ญ ๋ฉ๋ชจ๋ฆฌ๋ผ๊ณ ?
๊ทธ๋ ๋ค.
์ ์ญ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ญ์ง ์ดํด๋ณด์.
์๋ฐ์คํฌ๋ฆฝํธ: ์คํ ์ปจํ ์คํธ๋? ์ ์ญ ๋ฉ๋ชจ๋ฆฌ
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ ์ญ ๋ฉ๋ชจ๋ฆฌ๋ ๊ฐ๊ณ ์๋ค.
์ ์ญ ๋ฉ๋ชจ๋ฆฌ๋ ๋์ค์ ์ฌ์ฉํ ์ ์๋๋ก ์ ์ญ ๋ณ์์ ํจ์ ์ ์ธ์ ํฌํจํ๊ณ ์๋ค.
Kyle Simpson์ "Scope and Closures"๋ฅผ ์ฝ์ด๋ดค๋ค๋ฉด ์ ์ญ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ์ญ ์ค์ฝํ์ ๊ฐ๋
๊ณผ ๊ฒน์น๋ค๋ ๊ฒ์ ์์์ฑ์ ๊ฒ์ด๋ค.
์ฌ์ค ๋์ ๊ฐ์ ๊ฒ์ด๋ค.
๋ ์ฌ๊ธฐ 10,000ํผํธ ๋์ด๋ก ๋ ๊ณ ์๋ค, ๊ทธ๋ด ๋งํ ์ด์ ๊ฐ ์๋ค. (์ด๊ฑด ๋ฌด์จ ์๋ฏธ์ธ์ง ๋ชจ๋ฅด๊ฒ ๋ค..)
๊ทธ๊ฒ๋ค์ ์ด๋ ค์ด ๊ฐ๋
์ด๋ค.
๊ทธ๋๋ ์ง๊ธ์ ๊ฑฑ์ ํ ํ์๊ฐ ์๋ค.
์ฐ๋ฆฌ ํผ์ฆ ์ค ์ค์ํ ๋ ๊ฐ์ง ์กฐ๊ฐ์ ์ดํดํ๊ธธ ๋ฐ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋น์ ์ ์ฝ๋๋ฅผ ์คํ์ํฌ ๋ ์ด๊ฒ๋ค์ ์์ฑํ๋ค:
- ์ ์ญ ์คํ ์ปจํ ์คํธ
- ์ ์ญ ๋ฉ๋ชจ๋ฆฌ(๋ํ ์ ์ญ ์ค์ฝํ ํน์ ์ ์ญ ๋ณ์ ํ๊ฒฝ์ด๋ผ๊ณ ๋ ๋ถ๋ฆผ)
๋ชจ๋ ๊ฒ์ด ๋ช
ํํ๊ฐ?
๋ด๊ฐ ๋น์ ์ด์๋ค๋ฉด ์ด ์์ ์์ ์ด๋ ๊ฒ ํ ๊ฒ์ด๋ค:
- ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ค์ ์ ๊ณ
- ์์ ์ด ์์ง์ด๋ผ๊ณ ์๊ฐํ๊ณ ์ฝ๋๋ฅผ ๊ฐ ๋จ๊ณ๋ณ๋ก ํ์ฑ ํ๋ค.
- ์คํ๋๋ ๋์์ ์ ์ญ ์คํ ์ปจํ ์คํธ์ ์ ์ญ ๋ฉ๋ชจ๋ฆฌ์ ๋ํด์ ๊ทธ๋ ค์ ํํํด๋ณธ๋ค.
ํ๋กํ ํ์ดํ ํด ์์ด ์ข
์ด์ ์ ์ด๋ ๋๋ค.
๋์ ์์ ์์ ์ ๊ทธ๋ฆผ์ ์ด๋ ๊ฒ ๋ณด์ผ ๊ฒ์ด๋ค:
// ์ฒจ๋ถ๋์ด์๋ ๊ทธ๋ฆผ์ด ๊นจ์ง
๋ค์ ๋ถ๋ถ์์ ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ๋ฌด์์ด ๊ฒ ํธ์ถ ์คํ์ ๋ํด ์ดํด๋ณผ ๊ฒ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ: ์คํ ์ปจํ ์คํธ๋? ํธ์ถ ์คํ์ด๋?
์คํ ์ปจํ
์คํธ์ ์ ์ญ ๋ฉ๋ชจ๋ฆฌ, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ด๋ป๊ฒ ํจ๊ป ๋ง๋ฌผ๋ฆฌ๋์ง ๋ช
ํํ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ง๋๊ฐ?
๊ทธ๋ ์ง ์๋ค๋ฉด ์๊ฐ์ ๊ฐ๊ณ ์ด์ ๋ถ๋ถ์ ๋ณต์ตํด๋ณด๋ผ.
์ฐ๋ฆฌ์ ํผ์ฆ์ ๋ค๋ฅธ ์กฐ๊ฐ์ ๋ํด ์๊ฐํ ๊ฒ์ด๋ค: ํธ์ถ ์คํ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ๋น์ ์ ์ฝ๋๋ฅผ ์คํํ ๋ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๋์ง ๋ค์ ์ ๋ฆฌํด๋ณด์.
์ด๋ฌํ ๊ฒ๋ค์ ์์ฑํ๋ค:
- ์ ์ญ ์คํ ์ปจํ ์คํธ
- ์ ์ญ ๋ฉ๋ชจ๋ฆฌ
๊ทธ์ ๋ํด ์ฐ๋ฆฌ์ ์์ ์์ ๋ ์ด์ ์ผ์ด๋๋ ๊ฒ์ ์๋ค:
var num = 2;
function pow(num) {
return num * num;
}
์ด ์ฝ๋๋ ์์ํ๊ฒ ๊ฐ์ ํ ๋นํ๋ ๊ฒ์ด๋ค.
ํ ๋จ๊ณ ๋ ๋ค์ด๊ฐ์ ์ดํด๋ณด์.
ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋ฌด์์ด ์ผ์ด๋ ๊น?
var num = 2;
function pow(num) {
return num * num;
}
var res = pow(num);
ํฅ๋ฏธ๋ก์ด ์ง๋ฌธ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ํจ์๋ฅผ ํธ์ถํ๋ ํ๋์ ์์ง์ ๋์์ ์์ฒญํ๊ฒ ๋ง๋ ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ ๋์์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์น๊ตฌ๋ก๋ถํฐ ์ค๋๋ฐ ๊ทธ ์น๊ตฌ๋: ํธ์ถ ์คํ์ด๋ค.
๊ทธ๋ค์ง ๋ช
ํํ๊ฒ ๋ค๋ฆฌ์ง ์์์ง ๋ชจ๋ฅด์ง๋ง ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ด๋ค ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง์ ๋ํด ๊ณ์ ํ์
ํ ํ์๊ฐ ์๋ค.
ํ์
ํ๊ธฐ ์ํด ํธ์ถ ์คํ์ ์์กดํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ํธ์ถ ์คํ์ด๋ ๋ฌด์์ธ๊ฐ?
ํธ์ถ ์คํ์ ํ๋ก๊ทธ๋จ์ ํ์ฌ ์คํ ๋ก๊ทธ์ ๊ฐ๋ค.
์ค์ ๋ก๋ ์๋ฃ ๊ตฌ์กฐ, ์ฆ ์คํ์ด๋ค.
ํธ์ถ ์คํ์ ์ ํํ ์ด๋ป๊ฒ ๋์ํ๋๊ฐ?
๋น์ฐํ๊ฒ๋ ๋ ๊ฐ์ง ๋ฉ์๋, ํธ์(push)์ ํ(pop)์ด ์๋ค.
ํธ์๋ ์คํ ์์ผ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ๋ฃ๋ ํ์์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ํจ์๋ฅผ ์คํํ ๋ ์์ง์ ๊ทธ ํจ์๋ฅผ ํธ์ถ ์คํ์ผ๋ก ํธ์ํ๋ค.
๋ชจ๋ ํจ์ ํธ์ถ์ ํธ์ถ ์คํ์ผ๋ก ํธ์๋๋ค.
๋งจ ๋จผ์ ํธ์๋๋ ๊ฒ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก๊ทธ๋จ ์คํ์ ๋ฉ์ธ ์ค๋ ๋์ธ main() (ํน์ global())์ด๋ค.
์ด์ ์ด์ ๊ทธ๋ฆผ์ ์ด๋ ๊ฒ ๋ณด์ผ ๊ฒ์ด๋ค:
// ์ฒจ๋ถ๋์ด์๋ ๊ทธ๋ฆผ์ด ๊นจ์ง
ํ์ ๋ฐ๋ฉด์ ์คํ์์ ๋ฌด์ธ๊ฐ๋ฅผ ์ ๊ฑฐํ๋ ํ์์ด๋ค.
ํจ์๊ฐ ์คํ์ ๋ง์น๋ฉด ํธ์ถ ์คํ์์ ํจ์๊ฐ ์ ๊ฑฐ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํธ์ถ ์คํ์ ์๋์ ๊ฐ์ด ๋ณด์ผ ๊ฒ์ด๋ค:
// ์ฒจ๋ถ๋์ด์๋ ๊ทธ๋ฆผ์ด ๊นจ์ง
๊ทธ๋ฆฌ๊ณ ์ด์ ์ฌ๊ธฐ์์ ๋น์ ์ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋
์ ๋ง์คํฐํ ์ค๋น๊ฐ ๋์๋ค.
๋๋ดํ๋ ๊ฑฐ ์๋๋ค.
ํ์ง๋ง ์๋ฃ๋์ง ์์ ๋ถ๋ถ์? ๋ค์ ๋ถ๋ถ์ผ๋ก ์ด๋ํ๋ผ!
์๋ฐ์คํฌ๋ฆฝํธ: ์คํ ์ปจํ
์คํธ๋? ์ง์ญ ์คํ ์ปจํ
์คํธ
์ง๊ธ๊น์ง ๋ชจ๋ ๊ฒ์ด ๋ช
ํํด ๋ณด์ธ๋ค.
์ฐ๋ฆฌ๊ฐ ๋ฌด์ธ๊ฐ๋ฅผ ๋์ณค๋๊ฐ?
์ฐ๋ฆฌ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ ์ญ ์คํ ์ปจํ
์คํธ์ ์ ์ญ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฑํ๋ค๋ ๊ฒ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ , ์ฝ๋์์ ํจ์๋ฅผ ํธ์ถํ๋ฉด:
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ๋์์ ์์ฒญํ๊ณ
- ๊ทธ ๋์์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์น๊ตฌ ํธ์ถ ์คํ์ผ๋ก๋ถํฐ ์ค๋ฉฐ
- ํธ์ถ ์คํ์ ๋น์ ์ ์ฝ๋์์ ์ด๋ ํจ์๊ฐ ํธ์ถ๋ ๊ฒ์ธ์ง ํ์ ํ๊ณ ์๋ค
ํ์ง๋ง ์๋ฐ์คํฌ๋ฆฝํธ์์ ํจ์๋ฅผ ์คํํ๋ ค๋ฉด ๋ ๋ค๋ฅธ ํ ๊ฐ์ง๊ฐ ๋ฐ์ํด์ผ ํ๋ค.
์ฒซ ๋ฒ์งธ๋ก, ํจ์๋ ์ ์ญ ์คํ ์ปจํ
์คํธ์ ๋ํ๋๋ค.
๊ทธ๋ฆฌ๊ณ , ํจ์ ์์ ๋ ๋ค๋ฅธ ๋ฏธ๋ ์ปจํ
์คํธ๊ฐ ๋ํ๋๋ค.
๊ทธ ์์ ์์๋ฅผ ์ง์ญ ์คํ ์ปจํ
์คํธ(Local Execution Context)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋ญ??
๋์น์ฑ๋ค๋ฉด, ์ด์ ๊ทธ๋ฆผ์์ ์๋ก์ด ๋ณ์๊ฐ ์ ์ญ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ๋ฌ๋ค: var res
res ๋ณ์๋ ๋จผ์ undefined ๊ฐ์ ๊ฐ๊ณ ์๋ค.
๊ทธ ํ pow๊ฐ ์ ์ญ ์คํ ์ปจํ
์คํธ์ ๋ํ๋์๋ง์, ํจ์๊ฐ ์คํ๋๊ณ res๋ ํจ์์ ๋ฆฌํด ๊ฐ์ ๊ฐ๋๋ค.
์คํ ๋จ๊ณ ๋์ ์ง์ญ ๋ณ์๋ฅผ ๋ด์๋๊ธฐ ์ํด์ ์ง์ญ ์คํ ์ปจํ
์คํธ๊ฐ ์์ฑ๋๋ค.
์ผ๋ง๋ ๊ฐ๋ ฅํ ๊ฐ๋
์ธ๊ฐ.
// ์ฒจ๋ถ๋์ด์๋ ๊ทธ๋ฆผ์ด ๊นจ์ง
๊ธฐ์ตํด๋๋ผ.
์ ์ญ๊ณผ ์ง์ญ ์คํ ์ปจํ
์คํธ ๋ชจ๋๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ฝํ์ ํด๋ก์ ๋ฅผ ๋ง์คํฐํ๋ ํค์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ: ์คํ ์ปจํ ์คํธ๋? ํธ์ถ ์คํ์ด๋? ์ ๋ฆฌ
4์ค์ ์ฝ๋ ๋ค์ ๋ฌด์์ด ์์๋์ง ๋ฏฟ์ ์ ์๋๊ฐ?
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์คํ ์ปจํ
์คํธ, ์ ์ญ ๋ฉ๋ชจ๋ฆฌ ๊ทธ๋ฆฌ๊ณ ํธ์ถ ์คํ์ ์์ฑํ๋ค.
ํ์ง๋ง ๋น์ ์ด ํจ์๋ฅผ ํธ์ถํ๋ฉด ์์ง์ ์ง์ญ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ง์ญ ์คํ ์ปจํ
์คํธ๋ฅผ ์์ฑํ๋ค.
์ด ํฌ์คํธ๊ฐ ๋๋ ๋ฌด๋ ต ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์คํํ ๋ ๋ฌด์์ด ์ผ์ด๋๋์ง ์ดํดํ ์ ์์ด์ผ ํ๋ค.
์ข
์ข
๊ฐ๊ณผ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ด๋ถ๋ ์๋ก์ด ๊ฐ๋ฐ์๋ค์ ์ํด ํญ์ ๋ถ๊ฐ์ฌ์ํ ๊ฒ์ผ๋ก ์ฌ๊ฒจ์ง๋ค.
ํ์ง๋ง ๊ทธ๊ฒ์ด ๊ณ ๊ธ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋
์ ๋ง์คํฐํ๋ ํค์ด๋ค.
์คํ ์ปจํ
์คํธ, ์ ์ญ ๋ฉ๋ชจ๋ฆฌ, ํธ์ถ ์คํ์ ๋ฐฐ์ด๋ค๋ฉด, ์ค์ฝํ, ํด๋ก์ , ์ฝ๋ฐฑ ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ฐ์ ๊ฒ๋ค์ ์์ฃผ ์ฌ์ธ ๊ฒ์ด๋ค.
ํนํ ํธ์ถ ์คํ์ ์ดํดํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํ๋ค.
์ด๊ฒ์ ์๊ฐํํ ์ ์์ผ๋ฉด ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ดํด๋๊ธฐ ์์ํ ๊ฒ์ด๋ค.
์ต์ข
์ ์ผ๋ก ์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋น๋๊ธฐ์ธ์ง ์ ์ฝ๋ฐฑ์ด ํ์ํ์ง๋ฅผ ์ดํดํ๊ฒ ๋ ๊ฒ์ด๋ค.
4์ค์ ์ฝ๋ ๋ค์ ๋ฌด์์ด ์๋์ง ์๊ณ ์์๋๊ฐ?
์ด์ ๋ ์๋ค.
Thanks for reading!
This material is part of my Advanced Javascript class available both as remote 1 to 1 training or as on site training in Europe.