JavaScript๋ฅผ ๊ณต๋ถํ๋ค ์ด๋ฐ ์๋ฌธ์ด ์๊ฒผ๋ค.
- ๋ณ์๋ ๋๋์ฒด ์ด๋์ ์ ์ฅ๋ ๊น?
- ํจ์ ์์์ ์ ๋ฐ๊นฅ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์๊น?
- JavaScript ์์ง์ ๋ณ์๋ฅผ ์ด๋ป๊ฒ ์ฐพ์๋ผ๊น?
๊ทธ ๋ต์ Lexical Environment์ Scope Chain์ ํตํด ์ฐพ์ ์ ์์๋ค.
๐ก Lexical Environment๋?
ํ์ฌ ์คํ ์ปจํ ์คํธ์ ๋ณ์ ์ ์ฅ ๊ณต๊ฐ + ์์ ์ค์ฝํ ์ฐธ์กฐ ์ ๋ณด
JavaScript๋ ์ฝ๋๊ฐ ์คํ๋ ๋ Execution Context๋ฅผ ์์ฑํ๋ค. ๊ทธ๋ฆฌ๊ณ Execution Context๊ฐ ๋ง๋ค์ด์ง ๋๋ง๋ค ์๋ก์ด Lexical Environment๊ฐ ํจ๊ป ์์ฑ๋๋ค.
๐ฆ Execution Context ๋ด๋ถ ๊ตฌ์กฐ
Execution Context
โโ Lexical Environment
โโ Variable Environment
โโ This Binding
์ฌ๊ธฐ์ ๋ณ์ ํ์์ ํต์ฌ ์ญํ ์ ํ๋ ๊ฒ์ด ๋ฐ๋ก Lexical Environment๋ค.
๐ฆ Lexical Environment ๋ด๋ถ ๊ตฌ์กฐ
Lexical Environment
โโ Environment Record
โโ Outer Reference
Lexical Environment๋ ๋ ๊ฐ์ง ์์๋ก ๊ตฌ์ฑ๋๋ค.
1. Environment Record : ํ์ฌ ์ค์ฝํ์ ์ ์ธ๋ ๋ณ์์ ํจ์๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ์ด๋ค.
function test() {
let a = 10;
}
Environment Record๋ a: 10์ด๋ค. ์ฆ, ํ์ฌ ์คํ ์ค์ธ ์ค์ฝํ์ ๋ณ์ ๋ชฉ๋ก์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
2. Outer Reference : ํ์ฌ ์ค์ฝํ์ ์์ ์ค์ฝํ๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ๋ค.
์ด ์ฐธ์กฐ๊ฐ ์ฐ๊ฒฐ๋๋ฉด์ JavaScript์ ๊ฐ์ฅ ์ค์ํ ๊ตฌ์กฐ๊ฐ ๋ง๋ค์ด์ง๋๋ฐ, ์ด๊ฒ ๋ฐ๋ก Scope Chain์ด๋ค.
์ ์ด๋ฆ์ด โLexicalโ์ผ๊น?
Lexical์ **โ์ฝ๋๊ฐ ์์ฑ๋ ์์น ๊ธฐ์คโ**์ด๋ผ๋ ์๋ฏธ๋ค.
JavaScript์ ์ค์ฝํ๋ ๋ค์ ๊ธฐ์ค์ผ๋ก ๊ฒฐ์ ๋๋ค.
โ ์ด๋์ ํธ์ถ๋์๋๊ฐ โ ์ด๋์ ์ ์ธ๋์๋๊ฐ
function outer() {
function inner() {}
}
inner ํจ์๋ ์ ์ธ๋ ์๊ฐ ์ด๋ฏธ outer ์ค์ฝํ๋ฅผ ๊ธฐ์ตํ๋ค.
์ด๊ฒ์ Lexical Scope(์ ์ ์ค์ฝํ)๋ผ๊ณ ํ๋ค.
๐ก Scope Chain์ด๋?
๋ณ์๋ฅผ ์ฐพ๊ธฐ ์ํด ์์ ์ค์ฝํ๋ฅผ ๋ฐ๋ผ ์ฌ๋ผ๊ฐ๋ ํ์ ๊ตฌ์กฐ์ด๋ค
JavaScript ์์ง์ ๋ณ์๋ฅผ ์ฐพ์ ๋ ํ ๋ฒ์ ์ ์ญ์ ๋ณด์ง ์๋๋ค. ํ์ฌ ์ค์ฝํ๋ถํฐ ๋จ๊ณ์ ์ผ๋ก ํ์ํ๋ค.
๐ ์์ ์ฝ๋
const a = 1;
function outer() {
const b = 2;
function inner() {
console.log(a, b);
}
inner();
}
outer();
์คํ ํ๋ฆ :
- Global Execution Context ์์ฑ
outer()ํธ์ถ โ ์๋ก์ด Execution Context ์์ฑinner()ํธ์ถ โ ๋ ์๋ก์ด Execution Context ์์ฑ
inner์์ ๋ณ์ ์ฐพ๋ ๊ณผ์
console.log(a, b);
์์ง์ ํ์ ์์:
b ์ฐพ๊ธฐ
inner ์ค์ฝํ โ ์์
outer ์ค์ฝํ โ ์์ โ
a ์ฐพ๊ธฐ
inner โ ์์
outer โ ์์
global โ ์์ โ
์ด์ฒ๋ผ JavaScript๋
ํ์ฌ ์ค์ฝํ โ ์์ ์ค์ฝํ โ ์ ์ญ ์ค์ฝํ
์์๋ก ๋ณ์๋ฅผ ํ์ํ๋ค.
์ด ์ฐ๊ฒฐ ๊ตฌ์กฐ๊ฐ ๋ฐ๋ก Scope Chain์ด๋ค.
โญ Scope Chain์ ์ค์ํ ํน์ง
๋ง์ด ์คํดํ๋ ๋ถ๋ถ์ด ์๋ค.
Scope Chain์ ์คํ ์ค์ ๋ง๋ค์ด์ง๋ ๊ฒ์ด ์๋๋ค.
๐ ํจ์๊ฐ ์ ์ธ๋๋ ์๊ฐ ์ด๋ฏธ ๊ฒฐ์ ๋๋ค.
๊ทธ๋์ JavaScript๋ ๋์ ์ค์ฝํ(dynamic scope) ๊ฐ ์๋๋ผ ์ ์ ์ค์ฝํ(lexical scope)๋ฅผ ์ฌ์ฉํ๋ค.
Execution Context์์ ๊ด๊ณ
์ง๊ธ๊น์ง ๋ด์ฉ์ ์ฐ๊ฒฐํ๋ฉด ์ด๋ ๊ฒ ์ ๋ฆฌ๋๋ค.
Execution Context ์์ฑ
โ
Lexical Environment ์์ฑ
โ
Outer Reference ์ฐ๊ฒฐ
โ
Scope Chain ํ์ฑ
โ
๋ณ์ ํ์ ๊ฐ๋ฅ
์ฆ,
Execution Context โ ์คํ ํ๊ฒฝ
Lexical Environment โ ๋ณ์ ์ ์ฅ ๊ณต๊ฐ
Scope Chain โ ๋ณ์ ํ์ ๊ท์น
๐งถ ํต์ฌ ์ ๋ฆฌ
JavaScript์์ ๋ณ์๋ฅผ ์ฐพ๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- Execution Context๋ฅผ ์์ฑํ๋ค.
- Lexical Environment๋ฅผ ์์ฑํ๋ค.
- Environment Record์ ๋ณ์๋ฅผ ์ ์ฅํ๋ค.
- Outer Reference๋ก ์์ ์ค์ฝํ๋ก ์ฐ๊ฒฐํ๋ค.
- Scope Chain์ ๋ฐ๋ผ ๋ณ์๋ฅผ ํ์ํ๋ค
๊ฒฐ๊ตญ JavaScript๋ ๊ฐ์ฅ ๊ฐ๊น์ด ์ค์ฝํ๋ถํฐ ์ฐจ๋ก๋๋ก ๋ณ์๋ฅผ ์ฐพ๋๋ค.