์ ์ : ํจ์์ ํจ์๊ฐ ์ ์ธ๋ ์ดํ์ ํ๊ฒฝ์ ์กฐํฉ
- ์ด๋ค ํจ์ A์์ ์ ์ธํ ๋ณ์ a๋ฅผ ์ฐธ์กฐํ๋ ๋ด๋ถ ํจ์ B๋ฅผ ์ธ๋ถ๋ก ์ ๋ฌํ ๊ฒฝ์ฐ,
A์ ์คํ ์ปจํ ์คํธ๊ฐ ์ข ๋ฃ๋ ์ดํ์๋ ๋ณ์ a๊ฐ ์ฌ๋ผ์ง์ง ์๋ ํ์
0. ์คํ ์ปจํ ์คํธ
- ์ ์ : ์คํํ ์ฝ๋์ ์ ๊ณตํ ํ๊ฒฝ ์ ๋ณด๋ค์ ๋ชจ์๋์ ๊ฐ์ฒด
- ํ์ธ์์ ๋์จ ํ์ฑ ๋ ์ฝ๋์ ๋น์ทํ ๊ฐ๋ ..?
// ------------------- (1)
var a = 1;
function outer() {
function inner() {
console.log(a);
var a = 3;
// --------------- (2)
}
inner(); // -------- (3)
console.log(a);
// ----------------- (4)
}
outer(); // ---------- (5)
console.log(a);
// ------------------- (6)
์ฝ ์คํ์ ํํ์ด๋ค. ํจ์๊ฐ ํธ์ถ๋๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํด๋น ํจ์์ ๋ํ ํ๊ฒฝ ์ ๋ณด๋ฅผ ์์งํด์ ์คํ ์ปจํ ์คํธ๋ฅผ ์์ฑํ ํ ์ฝ ์คํ์ ๋ด๋๋ค. ์ฒ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ์คํ๋๋ ์๊ฐ์๋ ์ ์ญ ์ปจํ ์คํธ๊ฐ ์ฝ ์คํ ์ ๋ด๊ธด๋ค.
์คํ ์ปจํ ์คํธ์ ๋ด๊ธฐ๋ ์ ๋ณด๋ก๋ ์๋ ์ธ๊ฐ์ง๊ฐ ์๋ค.
VariableEnvironment
ํ์ฌ ์ปจํ
์คํธ ๋ด์ ์๋ณ์๋ค์ ๋ํ ์ ๋ณด + ์ธ๋ถ ํ๊ฒฝ ์ ๋ณด.
์ ์ธ ์์ ์ LexicalEnvironment์ ์ค๋
์ท์ผ๋ก, ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์๋์ง ์์.
- environmentRecord (snapshot)
- outerEnvironmentReference (snapshot)
LexicalEnvironment
์ฒ์์๋ VariableEnvironment์ ๊ฐ์ง๋ง ๋ณ๊ฒฝ ์ฌํญ์ด ์ค์๊ฐ์ผ๋ก ๋ฐ์๋๋ค.
- environmentRecord
- ํ์ฌ ์ปจํ ์คํธ์ ๊ด๋ จ๋ ์ฝ๋๋ค์ ์๋ณ์ ์ ๋ณด๋ค์ด ์ ์ฅ
- ๋งค๊ฐ๋ณ์ ์ด๋ฆ, ํจ์ ์ ์ธ, ๋ณ์๋ช ๋ฑ์ ์์๋๋ก ์์ง
- ํธ์ด์คํ : ๋ณ์์ ํจ์ ์ ์ธ๋ถ ๋ฑ์ ์๋ก ๋จผ์ ๋์ด์ฌ๋ฆฐ๋ค.
- outerEnvironmentReference
- ๋ฐ๋ก ์ง์ ์ปจํ ์คํธ(ํด๋น ํจ์๊ฐ ์ ์ธ๋ ์์น)์ LexicalEvironment ์ ๋ณด๋ฅผ ์ฐธ์กฐ
- ์ค์ฝํ : ์ญ์ญ ํ๊ณ ์ฌ๋ผ๊ฐ๋ค๊ฐ ์ ์ญ ์ปจํ ์คํธ์ Lexical๊น์ง ๊ฐ๋ ์์ผ๋ฉด undefined
ThisBinding
- this ์๋ณ์๊ฐ ๋ฐ๋ผ๋ด์ผ ํ ๋์ ๊ฐ์ฒด
- this๊ฐ ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ ์ ์ญ ๊ฐ์ฒด ์ ์ฅ, ๊ทธ ์ธ์๋ ํจ์๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ๋ค๋ฆ
1. ๋ค์ ํด๋ก์
fuction doSomething() {
const x = 10;
function sum(y) {
return x + y;
}
return sum;
}
const something = doSomething();
console.log(something(3));
sum()
์์ ,doSomething()
์์ ์ ์ธํ x๋ฅผ ์ฐธ์กฐํ๋ค.doSomething()
์์ ๋ด๋ถํจ์ sum์ ์ธ๋ถ๋ก ์ ๋ฌํ๋ค.- ์ฝ์์์ 13์ด ์ฐํ๋ค. ์ฆ, x ๋ณ์๊ฐ ์ฌ๋ผ์ง์ง ์๋๋ค.
์์
function sum(x) {
return function(y) {
return x + y;
};
}
const add = sum(2);
console.log(add(7));
sum
์์ ์ต๋ช
ํจ์๋ฅผ ๋ฆฌํดํ๊ณ , ๊ทธ๊ฑธ add
์ ํ ๋นํด ์ถ๋ ฅํ๋ค.
- ์ ์ญ์ปจํ
์คํธ์ Lexical
Lexical.Record : const add, function sum
Lexical.Outer : null - sum ํจ์ ํธ์ถ : ์ฝ์คํ์ push
Lexical.Record : x, function anonymous()
Lexical.Outer :์ ์ญ ์ปจํ ์คํธ
(1)์ Lexical์ ์ฐธ์กฐ- ํจ์๊ฐ ํธ์ถ๋์ด ํ๊ฐ๋๋ ์์ ์ด ์๋ ํจ์๊ฐ ์ ์ธ๋๋ ์์ ์ ๊ฒฐ์ ๋๋ค.
- ์ฝ๋ ํ๊ฐ ํ์ ์คํ. x ←2, Record ์์ ๊ธฐ๋ก
- ์ฝ๋์ ๋ง์ง๋ง๊น์ง ์คํ ํ, sum์ Lexical์ ์ฝ์คํ์์ pop
- ๋ค์ ์ ์ญ ์ปจํ ์คํธ์ Lexical๋ก ๋์์ add๋ณ์์ sum์ ๋ฆฌํด๊ฐ์ธ ์ต๋ช ํจ์ ํ ๋น
- add ํจ์ ํธ์ถ : ์ฝ์คํ์ push
Lexical.Record : ๋งค๊ฐ๋ณ์ y๋ฅผ ํธ์ด์คํ ํด์ ๊ธฐ๋ก
Lexical.Outer :sum
(2)์ Lexical์ ์ฐธ์กฐ- ์ฌ๊ธฐ์, ์ด๋ฏธ ์์์ sum์ Lexical์ด ์ฝ์คํ์์ pop๋๋๋ฐ ์ด๋ป๊ฒ ๋๊ฑธ๊น
- sum()์์ ์ต๋ช ํจ์๊ฐ ์ ์ธ๋ ๋, sum์ Record๋ฅผ ์ต๋ช ํจ์์ Outer์ ๋ฑ๋ก์ ํ๋ค.
- ์ฆ, sum()์ด ๋ฆฌํดํ ์ต๋ช ํจ์์ Outer๊ฐ ๊ฐ๋ฆฌํค๋ Lexical์ ์ต๋ช ํจ์๊ฐ ์ ์ธ๋ ๋ ๊ฒฐ์ ๋๋ค.
- ์ฝ๋ ํ๊ฐ ํ์ ์คํ. y←7, Record ์์ ๊ธฐ๋ก
- ๋ฆฌํด๋ฌธ์ ์คํํ ๋, ํจ์ ์์ ์๋ x ๋ณ์๋ฅผ ๋ง์ดํ๊ฒ ๋จ...!!!
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ณ์ ํ์ ๊ณผ์
- ๋จผ์ ์๊ธฐ ์์ (add)์์ x๋ฅผ ์ฐพ์.
- ๋ค์์ผ๋ก
add
์ Lexical.Outer๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋sum
์ Lexical์์ ์ฐพ๋๋ค. - sum์ Lexical.Record์์ x = 2 ๋ฅผ ์ฐพ์ ์ ์๋ค.
- ์ฝ์คํ์๋ ์กด์ฌํ์ง ์์ง๋ง Outer๊ฐ ์ฐธ์กฐํ๋ ๊ณณ์์ ๊ฐ์ง๊ณ ์์ด ๋ณ์๊ฐ ์ฌ๋ผ์ง์ง ์๋ ํ์์ ํด๋ก์ ํ์์ด๋ผ๊ณ ๋งํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ๋ณ์๋ฅผ ์์ ๋ณ์๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋ค์ ์์ ๋ก ๋์์, add
์์ 9๊ฐ ๋ฆฌํด์ด ๋๊ณ ์ฝ์คํ์์ pop๋๋ค. ๋ค์ ์ ์ญ ์ปจํ
์คํธ์ ์ฝ๋๊ฐ ์คํ๋๊ณ ์ ์ญ ์ปจํ
์คํธ์ Lexical์ด ์ฝ ์คํ์์ pop๋๋ฉฐ ํ๋ก๊ทธ๋จ์ด ์ข
๋ฃ๋๋ค.