1. ํธ์ด์คํ
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ฝ ์คํ์ ์ ์ญ ์คํ์ปจํ ์คํธ๋ฅผ ๋ด๋๋ค.
- environmentRecord
- ํ์ฌ ์ปจํ ์คํธ์ ๊ด๋ จ๋ ์ฝ๋๋ค์ ์๋ณ์ ์ ๋ณด๋ค์ด ์ ์ฅ
- ๋งค๊ฐ๋ณ์ ์ด๋ฆ, ํจ์ ์ ์ธ, ๋ณ์๋ช ๋ฑ์ ์์๋๋ก ์์ง
- outerEnvironmentReference
- ๋ฐ๋ก ์ง์ ์ปจํ ์คํธ(ํด๋น ํจ์๊ฐ ์ ์ธ๋ ์์น)์ LexicalEvironment ์ ๋ณด๋ฅผ ์ฐธ์กฐ
์ฝ์คํ์์๋ ๊ฐ์ฅ ์ต๊ทผ์ ์คํ๋ ์คํ์ปจํ ์คํธ๋ง ํ์ฑํ๋๋ค. ๋ง์ฝ ํจ์ a์์ ํจ์ b๊ฐ ์คํ๋๋ฉด ๋ ์คํ ์ปจํ ์คํธ๋ฅผ ๋ด๋๋ค. ํจ์ b์ ์คํ์ ๋ง์น๊ณ ํจ์ b๊ฐ ์ข ๋ฃ๋๋ฉด ์คํ์ปจํ ์คํธ๊ฐ ์ฌ๋ผ์ง๊ณ ๋ค์ a๋ก ๋์์ด. ์์ด๋ ์ข ๋ฃ๋๋ฉด ์ ์ญ ์ปจํ ์คํธ๋ก.
console.log(TVChannel) //undefined
var TVChannel = "Netflix";
console.log(TVChannel); //Netflix
๋ค๋ฅธ ์ธ์ด๋ผ๋ฉด ์๋ฌ๊ฐ ๋๊ฒ ์ง๋ง, ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฒฝ์ฐ์๋ undefined๊ฐ ์ถ๋ ฅ๋๋ค. TVChannel์ด๋ผ๋ ๋ณ์๊ฐ ์ฒซ๋ฒ์งธ console.log
์ ์ ์ด๋ฏธ ๋ง๋ค์ด์ง ๊ฒ ์ฒ๋ผ ๋ณด์ธ๋ค. ์ด๋ ๊ฒ ์ ์ธ ๋ผ์ธ ์ ์๋ ์๋ฌ๊ฐ ๋์ง ์๊ณ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ ํ์์, ์ ์ธ๋ฌธ์ด ๋ง์น ์ต์๋จ์ ๋๋ ค์ค์ง ๋ฏํ ํ์์ธ๋ฏ ํด์, ํธ์ด์คํ
์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋ฌผ๋ก ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋์ด์ฌ๋ฆฐ๊ฒ ์๋๋ผ, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ๋จผ์ ์ฝ๋๋ฅผ ์ค์บํ๋ฉด์ ๋ณ์ ๊ฐ์ ์ ๋ณด๋ฅผ ์คํ์ปจํ ์คํธ ์ด๋๊ฐ(environment Record)์ ๋ฏธ๋ฆฌ ๊ธฐ๋กํด ๋๋๋ค.
- ์์ฑ๋จ๊ณ : execution context ์์ฑ. ์ ์ธ๋ฌธ๋ง ์คํํด์ environment record์ ๊ธฐ๋ก
- ์คํ๋จ๊ณ : ์ ์ธ๋ฌธ ์ธ ๋๋จธ์ง ์ฝ๋ ์์ฐจ์ ์คํ. environment record๋ฅผ ์ฐธ์กฐํ๊ฑฐ๋ ์ ๋ฐ์ดํธ
๋ณ์ ํธ์ด์คํ
- var : ์ ์ธ๊ณผ ๋์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ๊ณ undefined๋ก ์ด๊ธฐํํ๋ค.
- let, const : ์๋ณ์๋ฅผ ๊ธฐ๋กํด๋๊ธด ํ์ง๋ง ๊ฐ์ ์ด๊ธฐํํ์ง์๋๋ค . ์์ ์์ ์์, ์ ์ธ๋ฌธ ์ด์ ์ TVChannel์ ์ฐธ์กฐํ๋ ค๊ณ ํ๋ฉด reference error๊ฐ ๋ฐ์ํ๋ค. ์ฆ, ์ ์ธ ๋ผ์ธ ์ด์ ์๋ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ค. (์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๊ท์น์ ๋ฐ๋ผ๊ฐ๋๋ก ๋ณด์ํจ)
ํจ์ ํธ์ด์คํ
study();
var study = () => {};
- environment record์ ์๋ study : undefined
- undefined๋ผ๋ ๋ฐ์ดํฐํ์ ์ ํจ์์ ๋ฌ๋ฆฌ ํธ์ถ๋ ์ ์๊ธฐ ๋๋ฌธ์ type error๊ฐ ๋ฐ์ํ๋ค.
study();
const study = () => {};
- ๊ฐ์ ํจ์๋ฅผ const ํค์๋๋ก ์ ์ธํ๋ฉด ์์ง ํ๊ฒฝ๋ ์ฝ๋์ ๊ธฐ๋ก๋ ๊ฐ์ด ์์ด reference error๊ฐ ๋ฐ์.
- ํจ์๋ฅผ ๋ณ์์ ๋ด์์ ํจ์๋ฅผ ์ ์ธํ๋ ๋ฐฉ์์ ํจ์ ํํ์์ด๋ผ๊ณ ํ๋๋ฐ, ํจ์๋ฅผ ๋ณ์์ ๋ด๊ณ ์๊ธฐ ๋๋ฌธ์ ์์ ์ดํด๋ณธ ๋ณ์ ํธ์ด์คํ ๊ณผ ๋๊ฐ์ด ์๋ํ๋ค,
study();
function study() {}
- Function ํจ์
- ํจ์ ์ ์ธ๋ฌธ ๋ฐฉ์์ผ๋ก ํจ์๋ฅผ ์ ์ธํ๋ ๊ฒฝ์ฐ์๋ ์์ง์ด ์คํฐ๋ ํจ์์ ์ ์ธ๊ณผ ๋์์ ์์ฑ๋ ํจ์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ํ๊ฒฝ ๋ ์ฝ๋์ ๊ธฐ๋กํด๋ก๋๋ค. ๊ทธ๋ฆฌ๊ณ study ํจ์๋ฅผ ์คํํ๋ฉด ์๋ฌ ์์ด ์คํ๋๋ค.
- ํจ์ ์ ์ธ๋ฌธ : ์ ์ธ๊ณผ ๋์์ ํจ์๊ฐ ์์ฑ๋์ด ์ ์ธ ์ ์๋ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์
์ ๋ฆฌํ์๋ฉด, ํ๊ฒฝ๋ ์ฝ๋์ ๋ด๊ธฐ๋ ๊ฐ๋ค์ ๋ค์๊ณผ ๊ฐ๋ค.
- ํจ์ ํํ์
var : {study : undefined}
let, const : {study } - ํจ์ ์ ์ธ๋ฌธ
{study : f{} }
2. ์ค์ฝํ ์ฒด์ด๋
- ์๋ณ์ ๊ฒฐ์ : ์ฝ์คํ ์์ ๋์ผํ ์๋ณ์๊ฐ ์ฌ๋ฟ์ผ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ด๋ป๊ฒ outer๋ฅผ ํ์ฉํด์ ์์ฌ๊ฒฐ์ ์ ํ๋์ง
let lamp = false;
function goTo2F() {
let lamp = true;
console.log(lamp)
}
goTo2F();
- ๋ณ์ ์๋์ : ์์ ์ค์ฝํ์์ ๊ฐ์ ์ฐพ์ผ๋ฉด ๊ทธ ๋ฐ์ผ๋ก ๋ ์๋ด๋ ค๊ฐ. ๋์ผํ ์๋ณ์๋ก ์ธํด ์์ ์ค์ฝํ์์ ์ ์ธ๋ ์๋ณ์์ ๊ฐ์ด ๊ฐ๋ ค์ง๋ ํ์
3์ธต์ ์์ผ๋ฉด 2์ธต์ผ๋ก ๊ฐ์ ์ฐพ๊ณ , 2์ธต์ ์์ผ๋ฉด 1์ธต์ ๊ฐ์ ์ฐพ์. ์ด๋ ๊ฒ ์๋ณ์๋ฅผ ๊ฒฐ์ ํ ๋ ํ์ฉํ๋ ์ค์ฝํ๋ค์ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์ค์ฝํ ์ฒด์ธ์ด๋ผ๊ณ , ํ๊ณ ์ด๋ฐ ๊ณผ์ ์ ์ค์ฝํ์ฒด์ด๋์ด๋ผ๊ณ ํ๋ค.
3. ์คํ์ปจํ ์คํธ ์ ๋ฆฌ
- ์คํ์ปจํ ์คํธ : ์ฝ๋๋ฅผ ์คํํ๋๋ฐ ํ์ํ ํ๊ฒฝ์ ์ ๊ณตํ๋ ๊ฐ์ฒด
- ํ๊ฒฝ : ์ฝ๋ ์คํ์ ์ํฅ์ ์ฃผ๋ ์กฐ๊ฑด์ด๋ ์ํ
- Es3 : ๋น์์๋ ํจ์๊ฐ ์ด๋์์ ํธ์ถ๋๋๋์ ๋ฐ๋ผ ๊ฒฐ์ (๋์ ์ค์ฝํ)
- Es5 : ์คํ์ปจํ ์คํธ๋ผ๋ ํ๋์ ๋ฉ์ด๋ฆฌ, ํ๋์ ๋ฌถ์์ผ๋ก ๊ฒฐ์ (์ ์ ์ค์ฝํ)
์ฆ, ์คํ์ปจํ ์คํธ๋ ์๋ณ์ ๊ฒฐ์ ์ ๋์ฑ ํจ์จ์ ์ผ๋ก ํ๊ธฐ ์ํ ์๋จ.