์คํ ์ปจํ ์คํธ๊ฐ ๋ฌด์์ด๊ณ , ์ด๋ ํ ๊ธฐ๋ฅ์ ํ๋์ง ์์๋ณด์.
์คํ ์ปจํ ์คํธ
์คํ ์ปจํ ์คํธ๋ ์ฝ๋๊ฐ ์คํ๋๋ ํ๊ฒฝ์ด๋ค. ํจ์ ํธ์ถ, ์ ์ญ ์ฝ๋ ์คํ, eval() ์คํ ๋ฑ ๋ชจ๋ ์คํ ๋จ์๊ฐ ์คํ ์ปจํ ์คํธ์์ ์ฒ๋ฆฌ๋๋ค.
์คํ ์ปจํ ์คํธ๋ ์์ค์ฝ๋๋ฅผ ์คํํ๋ ๋ฐ ํ์ํ ํ๊ฒฝ์ ์ ๊ณตํ๊ณ ์ฝ๋์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ค์ ๋ก ๊ด๋ฆฌํ๋ ์์ญ์ด๋ค.
-์๋ฐ์คํฌ๋ฆฝํธ Deep Dive
๊ตฌ์ฑ์์
Call Stack
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋จ์ผ Call Stack์ ์ฌ์ฉํด ์คํ ์ปจํ ์คํธ๋ฅผ ๊ด๋ฆฌํ๋ค.
๊ฐ ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค ์๋ก์ด ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๊ณ Call Stack์ ์์ธ๋ค.
1. ์์ฑ ๋จ๊ณ
- ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๋ฉฐ, ์ ์ธ๋ฌธ๋ง ์คํํด์ ํ๊ฒฝ ๋ ์ฝ๋(Environment Record)์ ๊ธฐ๋กํ๋ค.
2. ์คํ ๋จ๊ณ
- ์ ์ธ๋ฌธ ์ธ ๋๋จธ์ง ์ฝ๋๊ฐ ์์ฐจ์ ์ผ๋ก ์คํ๋๋ค.
- ์ด๋ ํ๊ฒฝ ๋ ์ฝ๋๋ฅผ ์ฐธ์กฐํ๊ฑฐ๋ ์ ๋ฐ์ดํธํ๋ค.
call stack ๊ณผ์
console.log(Foo); // 1
var Foo = "์๊ฐ" // 2
console.log(Foo); // 3
- ์ ์ญ ์คํ ์ปจํ ์คํธ ์์ฑ : Call Stack์ ์ ์ญ ์คํ ์ปจํ ์คํธ๊ฐ ์์ธ๋ค.
- ๋ณ์ ์ ์ธ : Foo๋ var ํค์๋๋ฅผ ํตํด ์ ์ธํ๊ธฐ ๋๋ฌธ์, ์ด๊ธฐํ๋๊ธฐ ์ ์
undefined
๋ก ์ค์ ๋๋ค. - ์ ์ญ ์คํ ์ข ๋ฃ : ๋ชจ๋ ์ฝ๋ ์คํ์ด ๋๋๋ฉด Call Stack์ด ๋น์์ง๋ค.
๋ง์ฝ ์ฌ๊ธฐ์ var
ํค์๋๋ฅผ ์ฌ์ฉํด ๋ณ์๋ฅผ ์ ์ธํ์ง ์๊ณ const, let
์ ์ฌ์ฉํด ์ ์ธ์ ํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ด๋ฅผ ์ด๊ธฐํํ์ง ๋ชปํด Reference Error
๊ฐ ๋ฐ์ํ๋ค.
์คํ ์ปจํ ์คํธ ๋ด๋ถ ๊ตฌ์กฐ
1. ๋ ์์ปฌ ํ๊ฒฝ
- ์ฝ๋ ์คํ ์์ ์ ๋ณ์๋ฅผ ํฌํจํ ์ค์ฝํ ์ ๋ณด๊ฐ ์ ์ฅ
2. ๋ณ์ ํ๊ฒฝ
- ๋ณ์ ์ ์ธ ๋ฐ ์ด๊ธฐํ ์ ๋ณด๋ฅผ ํฌํจ
3. this ๋ฐ์ธ๋ฉ
- ํจ์ ํธ์ถ ๋ฐฉ์์ ๋ฐ๋ผ
this
๊ฐ ๊ฒฐ์ ๋จ
์ค์ฝํ๋ ๋ฒ์๋ผ๋ ๋ป์ผ๋ก, ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ค์ฝํ๋ "๋ณ์์ ์ ๊ทผํ ์ ์๋ ๋ฒ์"๋ฅผ ์๋ฏธํ๋ค.
๋ ์์ปฌ ํ๊ฒฝ
1. ์ธ๋ถ ํ๊ฒฝ ๋ณ์ Outer Enviconment Reference
- ์ธ๋ถ ํ๊ฒฝ ์ฐธ์กฐ, ๋ฐ๊นฅ Lexical Environment๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
2. ํ๊ฒฝ ๋ ์ฝ๋ Environment Record
- ์๋ณ์๋ฅผ ๋ฑ๋กํ๊ณ ๋ฑ๋ก๋ ์๋ณ์์ ๋ฐ์ธ๋ฉ๋ ๊ฐ์ ๊ด๋ฆฌํ๋ ์ ์ฅ์์ด๋ค.
์์
์๋ณ์ ๊ฒฐ์
์ฝ๋์์ ๋ณ์๋ ํจ์์ ๊ฐ์ ๊ฒฐ์ ํ๋ ๊ฒ
var x = 1;
const y = 2;
function foo() {
var x = 3;
const y = 4;
function bar() {
const z = 5;
console.log(x + y + z);
}
bar();
}
foo();
๋ณ์ x, y, ํจ์ foo๊ฐ ํ๊ฒฝ ๋ ์ฝ๋์ ๋ฑ๋ก๋๋ค.
foo()๋ฅผ ์คํํ๋ฉด ์๋ก์ด ์คํ์ปจํ ์คํธ๊ฐ ์์ฑ๋๊ณ , ๋ง์ฐฌ๊ฐ์ง๋ก foo ํจ์ ๋ด๋ถ์ ์๋ ๋ณ์์ ํจ์๋ฅผ ํ๊ฒฝ ๋ ์ฝ๋์ ๋ฑ๋กํ๋ค.
๋ง์ฝ ํ๊ฒฝ๋ ์ฝ๋์ ์๋ณ์๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์๋ก ์์ฑ๋ ์คํ ์ปจํ ์คํธ์ ๋ฐ๊นฅ ๋ ์์ปฌ ํ๊ฒฝ์ผ๋ก ๋์๊ฐ ์ ์๋ outer(์ธ๋ถ ํ๊ฒฝ ๋ณ์)๋ฅผ ๋จ๊ฒจ๋๋๋ค. ์ด๋ฅผ ํตํด ํ์ํ ๊ฒฝ์ฐ ์ด์ ํ๊ฒฝ ๋ ์ฝ๋์ ์ ์ฅ๋ ์๋ณ์๋ ์ฐธ์กฐํ ์ ์๋ค. ์ด๋ฌํ ๊ตฌ์กฐ๋ฅผ ์ค์ฝํ ์ฒด์ธ์ด๋ผ๊ณ ํ๋ค.
bar
ํจ์์ outer๋ ์ด์ ๋ ์์ปฌ ํ๊ฒฝ์ธ foo
๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
๋ณ์ ํ์ ๊ณผ์
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ณ์์ ๊ฐ์ ๊ฒฐ์ ํ๊ธฐ ์ํด ํ๊ฒฝ ๋ ์ฝ๋๋ฅผ ํ์ธํ๋ค. ์์น์ ์ผ๋ก ํ์ฌ ํ์ฑํ๋(๊ฐ์ฅ ์์ ์๋) ์คํ์ปจํ ์คํธ์ ํ๊ฒฝ๋ ์ฝ๋๋ฅผ ๋จผ์ ๋ณธ๋ค.
- ์๋ณ์๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด
outer
๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฐ๊นฅ ๋ ์์ปฌ ํ๊ฒฝ์ผ๋ก ์ด๋ํ์ฌ ํ์์ ์ด์ด๊ฐ๋ค. - ๋ชจ๋ ๋ ์์ปฌ ํ๊ฒฝ์ ํ์ํด๋ ์๋ณ์๊ฐ ์์ผ๋ฉด Reference Error๊ฐ ๋ฐ์ํ๋ค.
์ฐธ๊ณ
- ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive
- ์ ํ๋ธ (๊ฐ์ถ!) [10๋ถ ํ ์ฝํก] ๐ ํ๋ฃจ์ แแ ตแฏแแ ขแผ แแ ฅแซแแ ฆแจแแ ณแแ ณ
'Javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํด๋ก์ ์ useState (0) | 2025.01.09 |
---|---|
Map๊ณผ ์ผ๋ฐ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ๊ฐ์? (1) | 2024.10.03 |