๋ค์ด๊ฐ๊ธฐ ์
์คํ ์ปจํ ์คํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋์ ์๋ฆฌ๋ฅผ ๋ด๊ณ ์๋ ํต์ฌ ์๋ฆฌ์ด๋ค.
๋ฐ๋ผ์ ์คํ์ปจํ ์คํธ๋ ์๋ ๊ฐ๋ ๋ค์ ๋์์๋ฆฌ๋ฅผ ๋ด๊ณ ์๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ค์ฝํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ณ์์ ์๋ณ์์ ๋ฐ์ธ๋ฉ๋ ๊ฐ์ ๊ด๋ฆฌํ๋ ๋ฐฉ์
- ํธ์ด์คํ ์ด ๋ฐ์ํ๋ ์ด์
- ํด๋ก์ ์ ๋์ ๋ฐฉ์
- ํ์คํ ํ์ ํจ๊ป ๋์ํ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๋์ ๋ฐฉ์
์คํ ์ปจํ ์คํธ๋?
์คํ ์ปจํ ์คํธ๋ ์์ค์ฝ๋๋ฅผ ์คํํ๋ ๋ฐ ํ์ํ ํ๊ฒฝ ์ ๋ณด๋ฅผ ๋ชจ์๋์ ๊ฐ์ฒด์ด๋ค.
์ฆ, ์คํ ์ปจํ ์คํธ๋ ๋ณ์, ํจ์, ํด๋์ค ๋ฑ์ ์ด๋ฆ์ธ ์๋ณ์๋ฅผ ๋ฑ๋กํ๊ณ ๊ด๋ฆฌํ๋ ์ค์ฝํ๋ผ๋ ํ๊ฒฝ ์ ๋ณด๋ฅผ ๊ตฌ์ฑํ๊ณ , ์ปจํ ์คํธ๋ฅผ ์ฝ ์คํ์ ์์์ฌ๋ ค ๊ฐ์ฅ ์์ ์๋ ์ปจํ ์คํธ๋ฅผ ์คํํ์ฌ ์ฝ๋์ ์คํ์์๋ฅผ ๋ณด์ฅํ๋ค.
์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๋ ์์
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์คํฌ๋ฆฝํธ๋ฅผ ์ฒ์ ์คํํ ๋ ์ ์ญ ์ปจํ ์คํธ๋ฅผ ์์ฑํ๊ณ ์ฝ์คํ์ ๋ด๋๋ค. ์ดํ ํจ์ ํธ์ถ์ ๋ฐ๊ฒฌํ๋ฉด ํด๋น ํจ์์ ์คํ ์ปจํ ์คํธ๋ฅผ ์ฝ์คํ์ ๋ด๋๋ค. ์ฆ, ํจ์ ์คํ ์ปจํ ์ค๋ ํจ์๊ฐ ์ ์ธ๋ ๋ ๋ง๋ค์ด์ง๋ ๊ฒ์ด ์๋ ํธ์ถ๋ ๋ ๋ง๋ค์ด์ง๊ฒ ๋๋ค.
์คํ ์ปจํ ์คํธ๋ 1) ์ ์ญ๊ณต๊ฐ 2) ํจ์ 3) eval() ํจ์๋ฅผ ํธ์ถํ ๋ ๋ง๋ค์ด์ง๊ฒ ๋๋๋ฐ,
eval์ ์๋๋ ๋ณด์์ด ์ข์ง ์์ ๊ฑฐ์ ์ฐ์ง ์๋๋ค.
์คํ ์ปจํ ์คํธ ๊ตฌ์กฐ
์ ์ฅ๋๋ ํ๊ฒฝ ์ ๋ณด๋ค์ ์๋ ์ฌ์ง๊ณผ ๊ฐ๋ค.
- Variable Environment : ํ์ฌ ์ปจํ ์คํธ ๋ด์ ์๋ณ์๋ค์ ๋ํ ์ ๋ณด + ์ธ๋ถ ํ๊ฒฝ ์ ๋ณด์ด๋ค. ์ ์ธ ์์ ์ Lexical Environment์ ์ค๋ ์ท์ผ๋ก, ๋ณ๊ฒฝ์ฌํญ์ ๋ฐ์๋์ง ์๋๋ค.
- Lexical Environment : ์ฒ์์๋ Variable Environment์ ๊ฐ์ง๋ง ๋ณ๊ฒฝ ์ฌํญ์ด ์ค์๊ฐ์ผ๋ก ๋ฐ์๋๋ค.
- This Binding : this ์๋ณ์๊ฐ ๋ฐ๋ผ๋ด์ผ ํ ๋์ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋ค.
Lexical Environment์ Variable Environment์ ๋ด๊ธฐ๋ ๋ด์ฉ์ ์ฒ์์๋ ๊ฐ์ง๋ง Variable Environment๋ ์ต์กฐ ์ค๋ ์ท์ ์ ์งํ๋ค๋ ์ ์์ ์ฐจ์ด๊ฐ ์๋ค. Lexical Environment๋ Variable Environment๋ฅผ ๊ทธ๋๋ก ๋ณต์ฌํด์ ๋ง๋ค์ด์ง๊ณ ์ดํ์ Lexical Environment์ด ์ฃผ๋ก ํ์ฉ๋๋ค.
์ด ๋ ํ๊ฒฝ์์๋ Environment Record์ Outer Environment Reference๋ก ๊ตฌ์ฑ๋๋ค.
- Environment Record : ํจ์ ์์ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ ์ ํ์ฌ ์ปจํ ์คํธ์ ๊ด๋ จ๋ ์ฝ๋์ ์๋ณ์ ์ ๋ณด(๋งค๊ฐ๋ณ์์ ์ด๋ฆ, ํจ์ ์ ์ธ, ๋ณ์๋ช ๋ฑ)๊ฐ ์ ์ฅ๋๋ค. ์ฆ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ด๋ฏธ ํด๋น ํ๊ฒฝ์ ์ํ ์ฝ๋์ ๋ณ์๋ช ์ ๋ชจ๋ ์๊ณ ์๊ฒ ๋๋ค. (ํธ์ด์คํ )
- Outer Environment Reference(์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ์ ๋ํ ์ฐธ์กฐ) : ์์ ์ค์ฝํ๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ์ฆ ํ์ฌ environment record๋ณด๋ค ๋ฐ๊นฅ์ ์๋ environment record๋ฅผ ์ฐธ๊ณ ํ๋ค๋ ๋ป์ด๋ค. ํด๋น ์คํ ์ปจํ ์คํธ๋ฅผ ์์ฑํ ํจ์์ ๋ฐ๊นฅ ํ๊ฒฝ์ ๊ฐ๋ฆฌํจ๋ค. ๋จผ์ ์ฝ๋ ์์์ ํน์ ํ ๋ณ์์ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด ํ์ฌ ์ปจํ ์คํธ์ Lexical Environment๋ฅผ ํ์ํ๊ณ , ๋ฐ๊ฒฌ๋๋ฉด ๊ทธ ๊ฐ์ ๋ฐํํ๋ค. ๋ฐ๊ฒฌํ์ง ๋ชปํ ๊ฒฝ์ฐ ๋ค์ Outer Environment Record์ ๋ด๊ธด Lexical Environment๋ฅผ ํ์ํ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ค. ์ ์ญ ์ปจํ ์คํธ์ Lexical Environment๊น์ง ํ์ํด์ ํด๋น ๋ณ์๋ฅผ ์ฐพ์ ์ ์๋ค๋ฉด undefined๋ฅผ ๋ฐํํ๋ค.
์์ ๋ก ์ดํดํ๋ ์คํ ์ปจํ ์คํธ
var a = 1;
function foo () {
const b = 2;
function bar () {
const c = 3;
console.log(a + b + c);
}
bar();
}
foo(); // 6
1. ์ ์ญ ์คํ ์ปจํ ์คํธ ์์ฑ ๋ฐ ํ๊ฒฝ ๋ ์ฝ๋ ์์ฑ
์ ์ฝ๋๋ฅผ ์คํํ๋ค๋ฉด ์ ์ญ ์ปจํ ์คํธ๊ฐ ์ฝ์คํ์ ํธ์๋๋ค. ์ ์ญ ์ปจํ ์คํธ๋ ์คํ ๋ช ๋ น์ด ๋ฐ๋ก ์์ด๋ ๋ธ๋ผ์ฐ์ ์์ ์๋์ผ๋ก ์คํํ๊ธฐ ๋๋ฌธ์ ์ฝ๋๊ฐ ๋ธ๋ผ์ฐ์ ์์ ๋ก๋๋๋ ์๊ฐ ์ ์ญ ์ปจํ ์คํธ๊ฐ ํ์ฑํ ๋๋ค. ์ ์ญ ์ฝ๋๋ฅผ ์คํ์ํค๊ธฐ ์ ์ ๋จผ์ ํ๊ฐ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ ์๋์ ๊ฐ์ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๊ฒ ๋๋ค.
Environment Record์๋ ํ์ฌ ์ปจํ ์คํธ์ ๊ด๋ จ๋ ์ฝ๋์ ์๋ณ์์ ์ ๋ณด๊ฐ ์ ์ฅ๋๋ค๊ณ ํ๋ค. ์ปจํ ์คํธ๋ฅผ ์ฒ์๋ถํฐ ๋๊น์ง ํ์ผ๋ฉด์ ์์๋๋ก ์๋ณ์๋ค์ ์์งํ๋๋ฐ ์ด๋ ์์ง๋๋ ์๋ณ์๋ค์ ๋งค๊ฐ๋ณ์, ํจ์, var๋ก ์ ์ธ๋ ๋ณ์๊ฐ ํด๋น๋๋ค. ๋ฐ๋ผ์ ์ ์ฌ์ง์ฒ๋ผ foo์ var์ธ a๊ฐ ์๋ณ์๋ก ๋ฑ๋ก์ด ๋ ๊ฒ์ด๋ค. (ํธ์ด์คํ )
var a๊ฐ ์์ง undefined์ธ ์ด์ ๋ ํ ๋น ๋๊ธฐ ์ ๊น์ง๋ ์ด๊ธฐํ ๋จ๊ณ๋ง ์งํ์ํค๊ธฐ ๋๋ฌธ์ด๋ค.
Lexical Environment
- Environment Record : a = undefined, foo = Function Object
- Outer Environment Reference : null(์ ์ญ์ด๊ธฐ ๋๋ฌธ์)
2. ์ ์ญ ์ฝ๋ ์คํ
์ฝ์คํ์ ์ ์ญ ์ปจํ ์คํธ์ ๊ด๋ จ๋ ์ฝ๋๊ฐ ์คํ๋์ด Lexical Environment๊ฐ ์ ๋ฐ์ดํธ ๋๊ณ a์ ๊ฐ์ด 1๋ก ํ ๋น๋๋ค. ๊ทธ๋ฆฌ๊ณ foo ํจ์๊ฐ ํธ์ถ๋๋ค.
Lexical Environment
- Environment Record : a = 1, foo = Function Object
- Outer Environment Reference : null(์ ์ญ์ด๊ธฐ ๋๋ฌธ์)
3. foo ํจ์ ์คํ ์ปจํ ์คํธ ์์ฑ ๋ฐ ํ๊ฒฝ ๋ ์ฝ๋ ์์ฑ
fooํจ์๋ฅผ ํธ์ถํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ foo์ ๋ํ ํ๊ฒฝ ์ ๋ณด๋ฅผ ์์งํด์ foo ์คํ ์ปจํ ์คํธ๋ฅผ ์์ฑํ ํ ์ฝ ์คํ์ ๋ด๋๋ค. ์ด๋ foo ํจ์ ์คํ ์ปจํ ์คํธ๋ ์คํ ์ปจํ ์คํธ ์คํ์ ์ต์์, ์ฆ ์คํ ์ค์ธ ์คํ ์ปจํ ์คํธ๊ฐ ๋๋ค.
Lexical Environment
- Environment Record : b = undefined, bar = Function Object
- Outer Environment Reference : Global Lexical Environment
4. foo()ํจ์ ์คํ
์ฝ์คํ์ foo() ํจ์ ์ปจํ ์คํธ์ ๊ด๋ จ๋ ์ฝ๋๊ฐ ์คํ๋์ด Lexical Environment๊ฐ ์ ๋ฐ์ดํธ ๋๊ณ b์ ๊ฐ์ด 2๋ก ํ ๋น๋๋ค. ๊ทธ๋ฆฌ๊ณ bar ํจ์๊ฐ ํธ์ถ๋๋ค.
Lexical Environment
- Environment Record : b = 2, bar = Function Object
- Outer Environment Reference : Global Lexical Environment
5. bar ํจ์ ์คํ ์ปจํ ์คํธ ์์ฑ ๋ฐ ํ๊ฒฝ ๋ ์ฝ๋ ์์ฑ
barํจ์๋ฅผ ํธ์ถํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ bar์ ๋ํ ํ๊ฒฝ ์ ๋ณด๋ฅผ ์์งํด์ bar ์คํ ์ปจํ ์คํธ๋ฅผ ์์ฑํ ํ ์ฝ ์คํ์ ๋ด๋๋ค. ์ด๋ bar ํจ์ ์คํ ์ปจํ ์คํธ๋ ์คํ ์ปจํ ์คํธ ์คํ์ ์ต์์, ์ฆ ์คํ ์ค์ธ ์คํ ์ปจํ ์คํธ๊ฐ ๋๋ค.
Lexical Environment
- Environment Record : c = undefined
- Outer Environment Reference : foo() Lexical environment
6. bar() ํจ์ ์คํ
์ฝ์คํ์ bar() ํจ์ ์ปจํ ์คํธ์ ๊ด๋ จ๋ ์ฝ๋๊ฐ ์คํ๋์ด Lexical Environment๊ฐ ์ ๋ฐ์ดํธ ๋๊ณ c์ ๊ฐ์ด 3์ผ๋ก ํ ๋น๋๋ค.
Lexical Environment
- Environment Record : c = undefined
- Outer Environment Reference : foo() Lexical environment
console.log(a + b + c);
1. console ์๋ณ์ ๊ฒ์
ํ์ฌ ์คํ์ค์ธ ์คํ ์ปจํ ์คํธ๋ bar ํจ์ ์คํ ์ปจํ ์คํธ์ด๋ค. console ์๋ณ์๋ ์ ์ญ ๊ฐ์ฒด์์ ๊ฐ์ฒด ํ๊ฒฝ ๋ ์ฝ๋์ BindingObject๋ฅผ ํตํด ์ฐพ์ ์ ์๋ค. ๋ฐ๋ผ์ ์ค์ฝํ ์ฒด์ธ์ ํตํด bar, foo, global ์์ผ๋ก ์๋ณ์๋ฅผ ์ฐพ๊ฒ ๋๋ค.
2. a, b, c ์๋ณ์ ๊ฒ์
c ์๋ณ์๋ bar ์ปจํ ์คํธ ๋ ์์ปฌ ํ๊ฒฝ์์, b ์๋ณ์๋ ์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ์ ๋ํ ์ฐธ์กฐ๋ก ์ด์ด์ง๋ foo ํจ์ ์ปจํ ์คํธ์ ๋ ์์ปฌ ํ๊ฒฝ์์, a ์๋ณ์๋ foo์์์ ์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ์ ๋ํ ์ฐธ์กฐ๋ก ์ด์ด์ง๋ global ์คํ ์ปจํ ์คํธ์ ๋ ์์ปฌ ํ๊ฒฝ์์ ๊ฒ์๋๋ค.
7. bar ํจ์ ์ฝ๋ ์คํ ์ข ๋ฃ
๋์ด์ ์คํํ ์ฝ๋๊ฐ ์๋ค๋ฉด bar ํจ์ ์ฝ๋์ ์คํ์ด ์ข ๋ฃ๋๋ค. ์ด๋ ์ฝ์คํ์์ bar ์คํ ์ปจํ ์คํธ๊ฐ pop ๋์ด ์ ๊ฑฐ๋๊ณ foo ์คํ์ปจํ ์คํธ๊ฐ ์คํ์ค์ธ ์คํ ์ปจํ ์คํธ๊ฐ ๋๋ค.
์ฝ์คํ์์ barํจ์ ์ปจํ ์คํธ๊ฐ ์ ๊ฑฐ๋์๋ค๊ณ ํด์ bar ํจ์ ๋ ์์ปฌ ํ๊ฒฝ๊น์ง ์ฆ์ ์๋ฉธํ๋ ๊ฒ์ ์๋๋ค. ๋ ์์ปฌ ํ๊ฒฝ์ ์คํ ์ปจํ ์คํธ์ ์ํด ์ฐธ์กฐ๋๊ธฐ๋ ํ์ง๋ง ๋ ๋ฆฝ์ ์ธ ๊ฐ์ฒด์ด๋ค. ๊ฐ์ฒด๋ฅผ ํฌํจํ ๋ชจ๋ ๊ฐ์ ๋๊ตฐ๊ฐ์ ์ํด ์ฐธ์กฐ๋์ง ์์ ๋ ๊ฐ๋น์ง์ปฌ๋ ํฐ(GC)์ ์ํด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณด๊ฐ ํด์ ๋์ด ์๋ฉธํ๋ค.
bar ํจ์ ์คํ ์ปจํ ์คํธ๊ฐ ์๋ฉธ๋์๋ค ํ๋๋ผ๋ ๋ง์ฝ bar ํจ์ ๋ ์์ปฌ ํ๊ฒฝ์ ๋๊ตฐ๊ฐ ์ฐธ์กฐํ๊ณ ์๋ค๋ฉด barํจ์ ๋ ์์ปฌ ํ๊ฒฝ์ ์๋ฉธํ์ง ์๋๋ค.
8. foo ํจ์ ์ฝ๋ ์คํ ์ข ๋ฃ
foo ํจ์ ์ญ์ ๋์ด์ ์คํํ ์ฝ๋๊ฐ ์์ผ๋ฉด foo ํจ์์ ์คํ์ด ์ข ๋ฃ๋๊ณ ์ ์ญ ์คํ ์ปจํ ์คํธ๊ฐ ์คํ ์ปจํ ์คํธ๊ฐ ๋๋ค.
9. ์ ์ญ ์ฝ๋ ์คํ ์ข ๋ฃ
์ ์ญ ์ฝ๋๋ ์คํํ ์ฝ๋๊ฐ ์์ผ๋ฉด ์ฝ์คํ์์ pop๋์ด ์คํ์๋ ์๋ฌด๊ฒ๋ ๋จ์์์ง ์๊ฒ ๋๋ค.
์ฐธ๊ณ
https://heycoding.tistory.com/86
https://velog.io/@edie_ko/js-execution-context
(์ฑ ) ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฅ๋ค์ด๋ธ