์ฃผ๋์ด ๊ฐ๋ฐ์์ ๊ฐ์ธ ๊ณต๋ถ ๊ณผ์ ์ ๊ธฐ๋กํฉ๋๋ค.
์คํ ์ปจํ ์คํธ
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ด๋ค ์คํ ์ปจํ ์คํธ๊ฐ ํ์ฑํ๋๋ ์์ ์
- ์ ์ธ๋ ๋ณ์๋ฅผ ์๋ก ๋์ด์ฌ๋ฆฌ๊ณ (ํธ์ด์คํ hoisting)
- ์ธ๋ถ ํ๊ฒฝ ์ ๋ณด๋ฅผ ๊ตฌ์ฑํ๊ณ
this
๊ฐ์ ์ค์ ํ๋ ๋ฑ์ ๋์์ ์ํ
ํ๋๋ฐ, ์ด๋ก ์ธํด ๋ค๋ฅธ ์ธ์ด์์๋ ๋ฐ๊ฒฌํ ์ ์๋ ํน์ดํ ํ์๋ค์ด ๋ฐ์ํ๋ค.
์คํ ์ปจํ ์คํธ๋?
execution context ์คํํ ์ฝ๋์ ํ๊ฒฝ ์ ๋ณด๋ค์ ๋ชจ์๋์ ๊ฐ์ฒด
- ์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ฐ์ฅ ์ค์ํ ๊ฐ๋
- ํจ์๋ฅผ ์คํํ ๋ ์คํ ์ปจํ ์คํธ๊ฐ ๊ตฌ์ฑ๋จ
- ํจ์๊ฐ ์คํ๋ ๋
call stack
์ ์์์ฌ๋ ค ์ฝ๋์ ํ๊ฒฝ๊ณผ ์์๋ฅผ ๋ณด์ฅํจ
๐กStack๊ณผ Queueโ
- Stack : FILO(First In Last Out), LIFO(Last In First Out)
- Queue : FIFO(First In First Out), LILO(Last In Last Out)
์คํ ์ปจํ ์คํธ์ ๊ตฌ์ฑ
- ์ ์ญ ๊ณต๊ฐ โ ์๋์ผ๋ก ์์ฑ
eval() ํจ์ โ ์ฌ์ฉ์ ๊ถ์ฅํ์ง ์์- ํจ์๋ฅผ ์คํ โ ๊ฐ์ฅ ํํ ์คํ ์ปจํ ์คํธ ๊ตฌ์ฑ ๋ฐฉ๋ฒ
- ES6 ๋ถํฐ๋ ๋ธ๋ก
{ }
์ ์ํด์๋ ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ
:: ์คํ ์ปจํ ์คํธ์ ์ฝ ์คํ ์์
// ------------------- (1)
var a = 1;
function outer() {
function inner() {
console.log(a); // undefined
var a = 3;
}
inner(); // -------- (2)
console.log(a); // 1
}
outer(); // ---------- (3)
console.log(a); // 1
์ ์ฝ๋๋ฅผ ์คํํ๋ ์๊ฐ (1)์ ์ญ ์ปจํ ์คํธ๊ฐ ์ฝ ์คํ์ ๋ด๊ธด๋ค.
- ์ ์ญ ์ปจํ ์คํธ๋ผ๋ ๊ฐ๋ ์ ์ผ๋ฐ์ ์ธ ์คํ ์ปจํ ์คํธ์ ํน๋ณํ ๋ค๋ฅผ ๊ฒ์ด ์๋ค.
- ๋ณ๋์ ์คํ ๋ช ๋ น์ด ์์ด๋ ๋ธ๋ผ์ฐ์ ์์ ์๋์ผ๋ก ์คํ๋๋ค.
๊ทธ ์ดํ ์ฝ๋๋ค์ ์์ฐจ๋ก ์งํํ๋ค๊ฐ
(3)์์ outer
ํจ์๋ฅผ ํธ์ถํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์
outer
์ ๋ํ ํ๊ฒฝ ์ ๋ณด๋ฅผ ์์งouter ์คํ ์ปจํ ์คํธ
๋ฅผ ์์ฑํ ํ ์ฝ ์คํ์ ๋ด๋๋ค
์ด ๋, ์ฝ ์คํ ๋งจ ์์ outer์คํ ์ปจํ ์คํธ๊ฐ ๋์ธ ์ํ์ด๋ฏ๋ก ์ ์ญ ์ปจํ ์คํธ์ ๊ด๋ จ๋ ์ฝ๋์ ์คํ์ ์ผ์ ์ค๋จํ๊ณ outer ์คํ ์ปจํ ์คํธ์ ๊ด๋ จ๋ ์ฝ๋(์ฆ, outerํจ์ ๋ด๋ถ ์ฝ๋)๋ค์ ์์ฐจ๋ก ์คํํ๋ค.
๋ค์ (2)์์ inner
ํจ์์ ์คํ ์ปจํ
์คํธ๊ฐ ์ฝ ์คํ ๊ฐ์ฅ ์์์ ๋ด๊ธฐ๋ฉด outer ์ปจํ
์คํธ์ ๊ด๋ จ๋ ์ฝ๋์ ์คํ์ ์ค๋จํ๊ณ inner ํจ์ ๋ด๋ถ์ ์ฝ๋๋ค์ ์์๋๋ก ์งํํ๋ค.
์ด๋ ๊ฒ ์ด๋ค ์คํ ์ปจํ ์คํธ๊ฐ ํ์ฑํ๋ ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํด๋น ์ปจํ ์คํธ์ ๊ด๋ จ๋ ์ฝ๋๋ค์ ์คํํ๋ ๋ฐ ํ์ํ ํ๊ฒฝ ์ ๋ณด๋ค์ ์์งํด์ ์คํ ์ปจํ ์คํธ ๊ฐ์ฒด์ ์ ์ฅํ๋ค. ์ด ๊ฐ์ฒด๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ํ์ฉํ ๋ชฉ์ ์ ์์ฑ๋ ๋ฟ, ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ํตํด ํ์ธ์ ํ ์ ์๋ค.
ํ์ฑํ ๋ ์คํ ์ปจํ ์คํธ ๊ฐ์ฒด์ ์์ง ์ ๋ณด
1. VariableEnvironment
์ต์ด ์คํ ์์ ์ค๋ ์ท์ ์ ์ง. VariableEnvironment์ ์ ๋ณด๋ฅผ ๋ณต์ฌํด์ LexicalEnvironment๋ฅผ ์์ฑ, ๊ทธ ์ดํ์ LexicalEnvironment๋ฅผ ์ฃผ๋ก ํ์ฉํ๊ฒ ๋๋ค.
- ํ์ฌ ์ปจํ ์คํธ ๋ด์ ์๋ณ์๋ค์ ๋ํ ์ ๋ณด + ์ธ๋ถ ํ๊ฒฝ ์ ๋ณด
- ์ ์ธ ์์ ์ LexicalEnvironment์ snapshot์ผ๋ก, ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์๋์ง ์๋๋ค.
VariableEnvironment์ LexicalEnvironment์ ๋ด๋ถ๋ environmentRecord์ outerEnvironmentReference๋ก ๊ตฌ์ฑ๋ผ ์๋ค.
2. LexicalEnvironment
: ์ฒ์์๋ VariableEnvironment์ ๊ฐ์ง๋ง ๋ณ๊ฒฝ ์ฌํญ์ด ์ค์๊ฐ์ผ๋ก ๋ฐ์๋๋ค.
๐ฉ environmentRecord์ ํธ์ด์คํ โจ
- environmentRecord์๋ ํํ ์ปจํ
์คํธ์ ๊ด๋ จ๋ ์ฝ๋์ ๋งค๊ฐ๋ณ์ ์ด๋ฆ, ํจ์ ์ ์ธ, ๋ณ์๋ช
๋ฑ ์๋ณ์ ์ ๋ณด๋ค์ด ์ ์ฅ(์ ์ธ๋ ๋ณ์์ ์๋ณ์ ๋ฑ)
์ปจํ ์คํธ ๋ด๋ถ ์ ์ฒด๋ฅผ ์ฒ์๋ถํฐ ๋๊น์ง ์์๋๋ก ์์งํ๋ค. ๋ณ์ ์ ๋ณด๋ฅผ ์์งํ๋ ๊ณผ์ ์ ๋ชจ๋ ๋ง์ณค๋๋ผ๋ ์์ง ์คํ ์ปจํ ์คํธ๊ฐ ๊ด์ฌํ ์ฝ๋๋ค์ ์คํ ์ ์ํ์ธ๋ฐ, ์ฝ๋๊ฐ ์คํ๋์ง ์ ์์๋ ๋ถ๊ตฌํ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ด๋ฏธ ํด๋น ํ๊ฒฝ์ ์ํ ์ฝ๋์ ๋ณ์๋ช ๋ค์ ๋ชจ๋ ์๊ณ ์๊ฒ ๋๋ค. ์ฌ๊ธฐ์ ํธ์ด์คํ ์ด๋ผ๋ ๊ฐ๋ ์ด ๋ฑ์ฅํ๋ค.
๐ฉ ์ค์ฝํ, ์ค์ฝํ ์ฒด์ธ, outerEnvironmentReference
-
์ค์ฝํscope?
์๋ณ์์ ๋ํ ์ ํจ๋ฒ์
- ES5๊น์ง๋ ์ ์ญ ๊ณต๊ฐ์ ์ ์ธํ๋ฉด ์ค์ง ํจ์์ ์ํด์๋ง ์ค์ฝํ๊ฐ ์์ฑ
- ES6์์๋ ๋ธ๋ก์ ์ํด์๋ ์ค์ฝํ ๊ฒฝ๊ณ๊ฐ ๋ฐ์ํ๊ฒ ํจ์ผ๋ก์จ ๋ค๋ฅธ ์ธ์ด์ ๋น์ทํด์ก๋ค.
- ๋ค๋ง,
var
๋ณ์์ ๋ํด์๋ ์์ฉํ์ง ์๊ณ ์๋ก ์๊ธดlet
,const
,class
,strict mode์์์ ํจ์ ์ ์ธ
๋ฑ์ ๋ํด์๋ง ์์ฉํ๋ค.- ES6์์๋ ๋์ ๊ตฌ๋ถํ๊ธฐ ์ํด ํจ์ ์ค์ฝํ, ๋ธ๋ก ์ค์ฝํ๋ผ๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํ๋ค.
-
์ค์ฝํ ์ฒด์ธ?
์ฌ๋ฌ ์ค์ฝํ์์ ๋์ผํ ์๋ณ์๋ฅผ ์ ์ธํ ๊ฒฝ์ฐ์๋ ๋ฌด์กฐ๊ฑด ์ค์ฝํ ์ฒด์ธ ์์์ ๊ฐ์ฅ ๋จผ์ ๋ฐ๊ฒฌ๋ ์๋ณ์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฒ
3. ThisBinding
this
์๋ณ์๊ฐ ๋ฐ๋ผ๋ด์ผ ํ ๋์ ๊ฐ์ฒด
์ ์ญ๋ณ์์ ์ง์ญ๋ณ์
- ์ ์ญ๋ณ์ : ์ ์ญ ๊ณต๊ฐ์์ ์ ์ธํ ๋ณ์. ์ ์ญ ์ปจํ
์คํธ์
LexicalEnvironment
์ ๋ด๊ธด ๋ณ์ - ์ง์ญ๋ณ์ : ํจ์ ๋ด๋ถ์์ ์ ์ธํ ๋ณ์
์์ ํ ์ฝ๋ ๊ตฌ์ฑ์ ์ํด ๊ฐ๊ธ์ ์ ์ญ๋ฒ์์ ์ฌ์ฉ์ ์ต์ํํ๋ ๊ฒ์ด ์ข๋ค
this
- ์คํ ์ปจํ ์คํธ์ thisBinding์๋ this๋ก ์ง์ ๋ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋จ
- ์คํ ์ปจํ ์คํธ ํ์ฑํ ๋น์์ this๊ฐ ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ, this์๋ ์ ์ญ ๊ฐ์ฒด๊ฐ ์ ์ฅ ๋จ
- ๊ทธ ๋ฐ์๋ ํจ์๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ this์ ์ ์ฅ๋๋ ๋์์ด ๋ค๋ฆ