โ ๏ธ ์ ๋ฆฌํ ๋ด์ฉ์ ์คํ๋ ์๋ชป๋ ์ ๋ณด๊ฐ ์์ ์ ์์ต๋๋ค. ๋๊ธ๋ก ์๋ ค์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
์คํ ์ปจํ ์คํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์คํํ ๋ ํ์ํ ์ ๋ณด๋ค์ ์ ์ฅํ๊ณ ์ ๊ณตํ๋ ํ๊ฒฝ์ด๋ค. ์ฆ, ์ค์ฝํ์ ์ ๋ณด๋ฅผ ๋ด์ ํ๊ฒฝ์ ์๋ฏธํ๋ค.
ํ์ฌ ์คํ๋๊ณ ์๋ ์ปจํ ์คํธ์์ ์ด ์ปจํ ์คํธ์ ๊ด๋ จ์ด ์๋ ์ฝ๋๊ฐ ์คํ๋๋ค๋ฉด ์๋ก์ด ์ปจํ ์คํธ๊ฐ ์์ฑ๋์ด ์ ์ด๊ถ์ ๊ฐ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ์์ฑ๋ ์ปจํ ์คํธ๋ค์ ์คํ ์ปจํ ์คํธ ์คํ ์์ ์์ด๊ฒ ๋๋ค. ๊ฐ๊ฐ์ ์ปจํ ์คํธ๋ ์คํ์ด ์ข ๋ฃ๋ ์ดํ ์๋ฉธ๋๋ฉฐ, ์๋ฉธ๋ ํ ์ด์ ์ ์คํ ์ปจํ ์คํธ์ ์ ์ด๊ถ์ ๋๊ฒจ์ฃผ๊ฒ ๋๋ค.
์คํ ์ปจํ ์คํธ๋ Lexical Environment์ Variable Environment ๋๊ฐ์ง ์ปดํฌ๋ํธ๋ก ๊ตฌ์ฑ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ปดํฌ๋ํธ๋ค์ Environment Records๋ผ ๋ถ๋ฆฌ๋ ํํ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
function foo() {
let a = 1;
const b = 2;
var c = 3;
console.log(a + b + c);
}
foo();
foo ์คํ ์ปจํ ์คํธ์ LE์ VE๋ fooํจ์ ํธ์ถ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค. ์ ์ธํ ์๋ณ์์ this๋ฐ์ธ๋ฉ ๊ทธ๋ฆฌ๊ณ ์์ ์ค์ฝํ์ธ ์ ์ญ ์คํ ์ปจํ ์คํธ์ GlobalER์ ์ฐธ์กฐํ๋ ์ธ๋ถ ํ๊ฒฝ ๋ ์ฝ๋์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ๋๋ค.
ER์ ๋ ์์ปฌ ์ค์ฝํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํน์ ๋ณ์์ ํจ์์ ๋ํ ์๋ณ์์ ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค. ๋ชจ๋ ER์๋ OuterEnv
ํ๋๊ฐ ์์ผ๋ฉฐ, ์ด ํ๋๋ ์์ ์ค์ฝํ์ ๋ํ ER์ ์ฐธ์กฐํ๋ค.
์ค์ฝํ ์ฒด์ธ์ด๋ ์ฉ์ด๋ ES3์ดํ๋ก ์ฌ์ฉํ์ง ์๋ ์ฉ์ด, ๊ทธ๋ ์ง๋ง ์ง๊ด์ ์ธ ์ดํด๋ฅผ ๋๊ธฐ ์ํด์ ์์ฃผ ์ฌ์ฉ๋๋ ๋ฏ ํจ. Lexical Environment ๊ฐ๋
์ด ๋์
๋ ์ดํ ECMAScript์๋ lexical nesting structure
์ฉ์ด๋ฅผ ์ฌ์ฉ
var ํค์๋๋ก ์ ์ธ๋ ๋ณ์์ ๋ฐ์ธ๋ฉ์ VE
๋ฅผ ํตํด ์ฐพ๊ณ , ์ด์ธ์ ์๋ณ์๋ค์ LE
๋ฅผ ํตํด ์ฐพ๋๋ค.
function foo() {
let x = 1;
function bar() {
const y = 2;
var z = 3;
console.log(x + y + z); // 6
}
bar();
}
foo();
์คํ์ปจํ
์คํธ์ ๋ํด์ ๊ทธ๋์ ๊ณ์ ๊ณต๋ถ๋ฅผ ํ์์ง๋ง ์ ๋๋ก ์ดํดํ์ง ๋ชปํ์๋ค๋ ์๊ฐ์ ์ด๋ฒ์ ๋ค์ ๊ณต๋ถํ๋ฉด์ ๊นจ๋ฌ์๋ค.
ํ์คํ ๊ฐ๋
ํ๋ํ๋๋ฅผ ๋ค์ ๋์ง์ด ๋ณด์๋๋ ์คํ ์ปจํ
์คํธ๊ฐ ์ด๋ ๊ฒ ๋์ํ๋๊ตฌ๋ํ๊ณ ํ๋ฆ์ ์๊ฒ๋์๋ค. ๊ทธ๋์ ๊ณต๋ถํ๋ค๊ณ ํ๋ฉด์ ์ ๋๋ก ์ดํดํ์ง ๋ชปํ๊ตฌ๋ ์ถ์๋ค. ์์ผ๋ก ๋ ๋ง์ ๊ฐ๋
๋ค์ ์๋ค๊ณ ํ์ ํ์ง ๋ง๊ณ ๋ฐ๋ณตํด์ ๊ณต๋ถํด์ผ๊ฒ ๋ค.~0~