์คํ ์ปจํ
์คํธ๋?
Stack(์คํ)
- ์ถ์
๊ตฌ๊ฐ ํ๋๋ฟ์ธ ๊น์ ์ฐ๋ฌผ ๊ฐ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ
- ์คํ์ ์์๋๋ก ๋ฐ์ดํฐ A-B-C-D๋ฅผ ์ ์ฅ
โ ๊บผ๋ผ ๋๋ ๋ฐ๋๋ก D-C-B-A ์์๋ก ๊บผ๋
Queue(ํ)
- ์์ชฝ์ด ๋ชจ๋ ์ด๋ ค์๋ ํ์ดํ ๊ฐ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ
- ๋ณดํต ํ์ชฝ์ ์
๋ ฅ๋ง, ๋ค๋ฅธ ํ์ชฝ์ ์ถ๋ ฅ๋ง ๋ด๋นํ๋ ๊ตฌ์กฐ
(์ข
๋ฅ์ ๋ฐ๋ผ ์์ชฝ ๋ชจ๋ ์
๋ ฅ๊ณผ ์ถ๋ ฅ์ด ๊ฐ๋ฅํ ํ๋ ์กด์ฌ)
- ํ์ ์์๋๋ก ๋ฐ์ดํฐ A-B-C-D๋ฅผ ์ ์ฅ
โ ๊บผ๋ผ ๋๋ A-B-C-D ์์๋ก ๊บผ๋
๊ทธ๋ฆผ 2-2) ์คํ๊ณผ ํ์ ๊ตฌ์กฐ
์คํ ์ปจํ
์คํธ
-
์คํํ ์ฝ๋์ ์ ๊ณตํ ํ๊ฒฝ ์ ๋ณด๋ค์ ๋ชจ์๋์ ๊ฐ์ฒด
-
๋์ผํ ํ๊ฒฝ์ ์๋ ์ฝ๋๋ค์ ์คํํ ๋ ํ์ํ ํ๊ฒฝ ์ ๋ณด๋ค์ ๋ชจ์ ์ปจํ
์คํธ๋ฅผ ๊ตฌ์ฑ
โ ์ด๋ฅผ call stack(์ฝ ์คํ)์ ์์ ์ฌ๋ฆผ
โ ๊ฐ์ฅ ์์ ์์ฌ์๋ ์ปจํ
์คํธ์ ๊ด๋ จ ์๋ ์ฝ๋๋ค์ ์คํํ๋ ๋ฐฉ์์ผ๋ก ์ ์ฒด ์ฝ๋์ ํ๊ฒฝ๊ณผ ์์๋ฅผ ๋ณด์ฅ
-
์ฌ๊ธฐ์ '๋์ผํ ํ๊ฒฝ', ์ฆ ํ๋์ ์คํ ์ปจํ
์คํธ๋ฅผ ๊ตฌ์ฑํ ์ ์๋ ๋ฐฉ๋ฒ
- ์ ์ญ๊ณต๊ฐ
- eval() ํจ์
- ํจ์
๋ฑ์ด ์๋ค.
์๋์ผ๋ก ์์ฑ๋๋ ์ ์ญ๊ณต๊ฐ, eval์ ์ ์ธ
ํํ ์คํ ์ปจํ
์คํธ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ : ํจ์ ์คํ
ES6์์๋ ๋ธ๋ก{}
์ ์ํด์๋ ์๋ก์ด ์คํ ์ปจํ
์คํธ๊ฐ ์์ฑ๋๋ค.
eval()
- ๋ฌธ์๋ก ํํ๋ JavaScript ์ฝ๋๋ฅผ ์คํํ๋ ํจ์
- ์ ์ญ ๊ฐ์ฒด์ ํจ์ ์์ฑ
- eval()์ ์ฌ์ฉํ๋ฉด ์
์ฑ ์ฝ๋๊ฐ ํ๊ฐ ์์ด ์์ฉ ํ๋ก๊ทธ๋จ ๋ด์์ ์คํ๋ ์ ์์ผ๋ฏ๋ก ๋ณด์์ด ์ํํ๋ค.
- ๊ทธ๋ฌ๋ฏ๋ก eval()์ ์ ๋ ์ฌ์ฉํ์ง ๋ง ๊ฒ!
์์ 2-1) ์คํ ์ปจํ
์คํธ์ ์ฝ ์คํ
var a = 1;
function outer () {
function inner () {
console.log(a);
var a = 3;
}
inner();
console.log(a);
}
outer();
console.log(a);
์์ ๋ฅผ ํตํด ์ฝ ์คํ์ ์คํ ์ปจํ
์คํธ๊ฐ ์ด๋ค ์์๋ก ์์ด๊ณ , ์ด๋ค ์์๋ก ์ฝ๋ ์คํ์ ๊ด์ฌํ๋์ง ํ์ธํ๊ธฐ
- ์ฒ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์คํํ๋ ์๊ฐ(1) ์ ์ญ ์ปจํ
์คํธ๊ฐ ์ฝ ์คํ์ ๋ด๊ธด๋ค.
โ ์ ์ญ ์ปจํ
์คํธ์ ๊ด๋ จ๋ ์ฝ๋๋ค์ ์์ฐจ์ ์ผ๋ก ์งํ
- ์ ์ญ ์ปจํ
์คํธ
- ์ต์๋จ์ ๊ณต๊ฐ์ ์ฝ๋ ๋ด๋ถ์์ ๋ณ๋์ ์คํ ๋ช
๋ น์ด ์์ด๋ ๋ธ๋ผ์ฐ์ ์์ ์๋์ผ๋ก ์คํ
โ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ด ์ด๋ฆฌ๋ ์๊ฐ ์ ์ญ ์ปจํ
์คํธ ํ์ฑํ
-
(3)์์ outer
ํจ์ ํธ์ถ
โ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ outer
์ ๋ํ ํ๊ฒฝ ์ ๋ณด๋ฅผ ์์งํด์ outer
์คํ ์ปจํ
์คํธ๋ฅผ ์์ฑ ํ ์ฝ ์คํ์ ๋ด๋๋ค.
โ ์ฝ ์คํ์ ๋งจ ์์ outer
์คํ ์ปจํ
์คํธ๊ฐ ๋์ธ ์ํ, ์ ์ญ ์ปจํ
์คํธ์ ๊ด๋ จ๋ ์ฝ๋์ ์คํ์ ์ผ์์ค๋จ ํ๊ณ outer
์คํ ์ปจํ
์คํธ์ ๊ด๋ จ๋ ์ฝ๋์ธ outer
ํจ์ ๋ด๋ถ์ ์ฝ๋๋ค์ ์์ฐจ์ ์ผ๋ก ์คํ
-
(2)์์ inner
ํจ์์ ์คํ ์ปจํ
์คํธ๊ฐ ์ฝ ์คํ์ ๋งจ ์์ ๋ด๊ธฐ๋ฉด outer
์ปจํ
์คํธ์ ๊ด๋ จ๋ ์ฝ๋์ ์คํ์ ์ค๋จํ๊ณ inner
ํจ์ ๋ด๋ถ์ ์ฝ๋๋ฅผ ์์๋๋ก ์งํ
๊ทธ๋ฆผ 2-3) ์คํ ์ปจํ
์คํธ์ ์ฝ ์คํ
-
inner
ํจ์ ๋ด๋ถ์์ a ๋ณ์์ ๊ฐ 3์ ํ ๋น ํ inner
ํจ์์ ์คํ์ด ์ข
๋ฃ๋๊ณ , inner
์คํ ์ปจํ
์คํธ๊ฐ ์ฝ ์คํ์์ ์ ๊ฑฐ
-
outer
์ปจํ
์คํธ๊ฐ ์ฝ ์คํ์ ๋งจ ์๋ก ์กด์ฌํ๊ฒ ๋๋ฉด์ (2)์ ๋ค์ ์ค๋ถํฐ ์ด์ด์ ์คํ. a ๋ณ์์ ๊ฐ์ ์ถ๋ ฅ ํ outer
ํจ์์ ์คํ์ด ์ข
๋ฃ๋๊ณ , outer
์คํ ์ปจํ
์คํธ๊ฐ ์ฝ ์คํ์์ ์ ๊ฑฐ
-
์ฝ ์คํ์ ์ ์ญ ์ปจํ
์คํธ๋ง ๋จ์ ์คํ์ ์ค๋จํ๋ (3)์ ๋ค์ ์ค๋ถํฐ ์ด์ด์ ์คํ. a ๋ณ์์ ๊ฐ์ ์ถ๋ ฅ ํ ์ ์ญ ๊ณต๊ฐ์ ์คํํ ์ฝ๋๊ฐ ๋จ์์์ง ์์ ์ ์ญ ์ปจํ
์คํธ๋ ์ ๊ฑฐ
-
์ฝ ์คํ์ ์๋ฌด๊ฒ๋ ๋จ์ง ์์ ์ํ๋ก ์ข
๋ฃ
ํ ์คํ ์ปจํ
์คํธ๊ฐ ์ฝ ์คํ์ ๋งจ ์์ ์์ด๋ ์๊ฐ === ํ์ฌ ์คํํ ์ฝ๋์ ๊ด์ฌํ๊ฒ ๋๋ ์์
โ ๊ธฐ์กด์ ์ปจํ
์คํธ๋ ์๋ก ์์ธ ์ปจํ
์คํธ๋ณด๋ค ์๋์ ์์นํ ์๋ฐ์ ์๋ค.
์ด๋ค ์คํ ์ปจํ
์คํธ๊ฐ ํ์ฑํ๋ ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํด๋น ์ปจํ
์คํธ์ ๊ด๋ จ๋ ์ฝ๋๋ค์ ์คํํ๋ ๋ฐ ํ์ํ ํ๊ฒฝ ์ ๋ณด๋ค์ ์์ง์์ ์คํ ์ปจํ
์คํธ ๊ฐ์ฒด์ ์ ์ฅ
- VariableEnvironment
- ํ์ฌ ์ปจํ
์คํธ ๋ด์ ์๋ณ์๋ค์ ๋ํ ์ ๋ณด + ์ธ๋ถ ํ๊ฒฝ ์ ๋ณด.
- ์ ์ธ ์์ ์ LexicalEnvironment์ ์ค๋
์ท(snapshot), ๋ณ๊ฒฝ์ฌํญ์ ๋ฐ์๋์ง ์์.
- LexicalEnvironment : ์ฒ์์๋ VariableEnvironment์ ๊ฐ์ง๋ง ๋ณ๊ฒฝ ์ฌํญ์ด ์ค์๊ฐ์ผ๋ก ๋ฐ์๋จ.
- ThisBinding : this ์๋ณ์๊ฐ ๋ฐ๋ผ๋ด์ผ ํ ๋์ ๊ฐ์ฒด.
VariableEnvironment
- LexicalEnvironment์ ๊ฐ์ง๋ง ์ต์ด ์คํ ์์ ์ค๋
์ท์ ์ ์ง
- ์คํ ์ปจํ
์คํธ ์์ฑ ์ VariableEnvironment์ ์ ๋ณด๋ฅผ ๋ด๋๋ค.
- ์ด ์ ๋ณด๋ฅผ ๊ทธ๋๋ก ๋ณต์ฌํด์ LexicalEnvironment๋ฅผ ์์ฑ, ์ดํ์๋ LexicalEnvironment๋ฅผ ์ฃผ๋ก ํ์ฉ
- VariableEnvironment์ LexicalEnvironment์ ๋ด๋ถ๋ environmentRecord์ outerEnvironmentReference๋ก ๊ตฌ์ฑ
LexicalEnvironment
environmentRecord
- ํ์ฌ ์ปจํ
์คํธ์ ๊ด๋ จ๋ ์ฝ๋์ ์๋ณ์ ์ ๋ณด ์ ์ฅ
- ์ปจํ
์คํธ ๋ด๋ถ ์ ์ฒด๋ฅผ ์ฒ์๋ถํฐ ๋๊น์ง ์ญ ํ์ด๋๊ฐ๋ฉฐ ์์๋๋ก ์์ง
์๋ณ์ : ์ปจํ
์คํธ๋ฅผ ๊ตฌ์ฑํ๋ ํจ์์ ์ง์ ๋ ๋งค๊ฐ๋ณ์ ์๋ณ์, ์ ์ธํ ํจ์๊ฐ ์์ ๊ฒฝ์ฐ ๊ทธ ํจ์ ์์ฒด, var๋ก ์ ์ธ๋ ๋ณ์์ ์๋ณ์ ๋ฑ- ๋ณ์ ์ ๋ณด๋ฅผ ์์งํ๋ ๊ณผ์ ์ ๋ง์ณค๋๋ผ๋ ์์ง ์คํ ์ปจํ
์คํธ๊ฐ ๊ด์ฌํ ์ฝ๋๋ค์ ์คํ๋์ง ์ ์ํ
Hoisting(ํธ์ด์คํ
)
- ๋ณ์ ์ ๋ณด ์์ง ๊ณผ์ ์ ๋ง์ณค๋๋ผ๋ ์์ง ์คํ ์ปจํ
์คํธ๊ฐ ๊ด์ฌํ ์ฝ๋๋ค์ด ์คํ๋๊ธฐ ์ ์ํ
- ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ ์ด์ง๋ง ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ด๋ฏธ ํด๋น ํ๊ฒฝ ์์ ๋ณ์๋ช
์ ๋ชจ๋ ์๊ณ ์๋ ์ํ
โ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์๋ณ์๋ค์ ์ต์๋จ์ผ๋ก ๋์ด์ฌ๋ ค๋์ ๋ค์ ์ค์ ์ฝ๋๋ฅผ ์คํํ๋ค.
๋ผ๊ณ ์๊ฐ
- ํธ์ด์คํ
: ๋ณ์ ์ ๋ณด๋ฅผ ์์งํ๋ ๊ณผ์ ์ ์ดํดํ๊ธฐ ์ฌ์ด ๋ฐฉ๋ฒ์ผ๋ก ๋์ฒดํ ๊ฐ์์ ๊ฐ๋
, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ค์ ๋ก ๋์ด์ฌ๋ฆฌ์ง๋ ์์ง๋ง ํธ์์ ๋์ด์ฌ๋ฆฐ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ์๋ ๊ฒ
ํธ์ด์คํ
์ ๋ํด ์์ ๋ฅผ ํตํด ์ดํดํ๊ธฐ
์ฃผ์ : ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๊ตฌ๋ ๋ฐฉ์์ ์ฌ๋์ ์
์ฅ์์ ์ดํดํ๊ธฐ ์ํ ์์ ์ฝ๋์
๋๋ค. ์ค์ ์์ง์ ์ด๋ฌํ ๋ณ๊ด ๊ณผ์ ์ ๊ฑฐ์น์ง ์์ต๋๋ค.
๋งค๊ฐ๋ณ์์ ๋ณ์์ ๋ํ ํธ์ด์คํ
์์ 2-2) ๋งค๊ฐ๋ณ์์ ๋ณ์์ ๋ํ ํธ์ด์คํ
(1) - ์๋ณธ ์ฝ๋
- (1), (2), (3)์์ ์ด๋ค ๊ฐ๋ค์ด ์ถ๋ ฅ๋ ์ง ์์ํด๋ณด๊ธฐ
- (1) ํจ์ ํธ์ถ ์ ์ ๋ฌํ 1์ด ์ถ๋ ฅ
- (2) ์ ์ธ๋ ๋ณ์ x์ ํ ๋นํ ๊ฐ์ด ์์ผ๋ฏ๋ก
undefined
์ถ๋ ฅ
- (3) 2 ์ถ๋ ฅ
function a (x) {
console.log(x);
var x;
console.log(x);
var = 2;
console.log(x);
}
a(1);
์์ 2-3) ๋งค๊ฐ๋ณ์์ ๋ณ์์ ๋ํ ํธ์ด์คํ
(2) - ๋งค๊ฐ๋ณ์๋ฅผ ๋ณ์ ์ ์ธ/ํ ๋น๊ณผ ๊ฐ๋ค๊ณ ๊ฐ์ฃผํด์ ๋ณํํ ์ํ
โ ์ธ์๋ค๊ณผ ํจ๊ป ํจ์๋ฅผ ํธ์ถํ ๊ฒฝ์ฐ์ ๋์์ผ๋ก ์ธ์๋ฅผ ํจ์ ๋ด๋ถ์ ๋ค๋ฅธ ์ฝ๋๋ณด๋ค ๋จผ์ ์ ์ธ ๋ฐ ํ ๋น์ด ์ด๋ค์ง ๊ฒ์ผ๋ก ๊ฐ์ฃผ
arguments : ์คํ ์ปจํ
์คํธ ์์ฑ ์์ ์ ํจ๊ป ๋ง๋๋ ์ ๋ณด ์ค ํ๋. ์ง์ ํ ๋งค๊ฐ๋ณ์์ ๊ฐ์์ ๋ฌด๊ดํ๊ฒ ํธ์ถ ์ ์ ๋ฌํ ์ธ์๊ฐ ๋ชจ๋ arguments ์ ๋ณด์ ๋ด๊น.
function a () {
var x = 1;
console.log(x);
var x;
console.log(x);
var x = 2;
console.log(x);
}
a();
์์ 2-4) ๋งค๊ฐ๋ณ์์ ๋ณ์์ ๋ํ ํธ์ด์คํ
(3) - ํธ์ด์คํ
(๋ณ์ ์ ๋ณด ์์ง ๊ณผ์ )์ ๋ง์น ์ํ
- environmentRecord๋ ํ์ฌ ์คํ๋ ์ปจํ
์คํธ์ ๋์ ์ฝ๋ ๋ด์ ์ด๋ค ์๋ณ์๋ค์ด ์๋์ง์๋ง ๊ด์ฌ์ด ์๊ณ , ๊ฐ ์๋ณ์์ ํ ๋น๋ ๊ฐ์๋ ๊ด์ฌ์ด ์๋ค.
โ ๋ณ์๋ฅผ ํธ์ด์คํ
ํ ๋ ๋ณ์๋ช
๋ง ๋์ด์ฌ๋ฆฌ๊ณ ํ ๋น ๊ณผ์ ์ ์๋ ์๋ฆฌ์ ์์น (๋งค๊ฐ๋ณ์๋ ๋์ผ)
function a () {
var x;
var x;
var x;
x = 1;
console.log(x);
console.log(x);
x = 2;
console.log(x);
}
a(1);
์ค์ ์ฝ๋ ์คํ ๊ณผ์
[1] : ๋ณ์ x ์ ์ธ
- ์ด ๋ ๋ฉ๋ชจ๋ฆฌ์์๋ ์ ์ฅํ ๊ณต๊ฐ์ ๋ฏธ๋ฆฌ ํ๋ณดํ๊ณ , ํ๋ณดํ ๊ณต๊ฐ์ ์ฃผ์๊ฐ์ ๋ณ์ x์ ์ฐ๊ฒฐ
[2], [3] : ๋ค์ ๋ณ์ x ์ ์ธ. ์ด๋ฏธ ์ ์ธ๋ ๋ณ์ x๊ฐ ์์ผ๋ฏ๋ก ๋ฌด์
[4] : x์ 1์ ํ ๋น
- ์ซ์ 1์ ๋ณ๋์ ๋ฉ๋ชจ๋ฆฌ์ ๋ด๊ณ , x์ ์ฐ๊ฒฐ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ซ์ 1์ ๊ฐ๋ฆฌํค๋ ์ฃผ์๊ฐ ์
๋ ฅ
[5], [6] : (1), (2)์์ ๋ชจ๋ 1
์ ์ถ๋ ฅ
[7] : x์ 2๋ฅผ ํ ๋น
- ์ซ์ 2๋ฅผ ๋ณ๋์ ๋ฉ๋ชจ๋ฆฌ์ ๋ด๊ณ , ๊ทธ ์ฃผ์๊ฐ์ ๋ ์ฑ๋ก x์ ์ฐ๊ฒฐ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ผ๋ก ๊ฐ๋ค.
- ์ซ์ 1์ ๊ฐ๋ฆฌํค๋ ์ฃผ์๊ฐ์ด ์๋ ๊ฒ์ 2์ ์ฃผ์๊ฐ์ผ๋ก ๋์นํ์ฌ ๋ณ์ x๋ 2๋ฅผ ๊ฐ๋ฆฌํด
[8] : (3)์์ 2
๋ฅผ ์ถ๋ ฅ
- ํจ์ ๋ด๋ถ์ ๋ชจ๋ ์ฝ๋๊ฐ ์คํ๋์์ผ๋ฏ๋ก ์คํ ์ปจํ
์คํธ๊ฐ ์ฝ ์คํ์์ ์ ๊ฑฐ
| ์์ ์ถ๋ ฅ ๊ฐ | ์ค์ ์ถ๋ ฅ ๊ฐ |
---|
(1) | 1 | 1 |
(2) | undefined | 1 |
(3) | 2 | 2 |
ํจ์ ์ ์ธ๋ฌธ(function declaration)๊ณผ ํจ์ ํํ์(function expression)
ํจ์๋ฅผ ์๋กญ๊ฒ ์ ์ํ ๋ ์ฐ์ด๋ ๋ฐฉ์
ํจ์ ์ ์ธ๋ฌธ
- function ์ ์๋ถ๋ง ์กด์ฌํ๊ณ , ๋ณ๋์ ํ ๋น ๋ช
๋ น์ด ์๋ ๊ฒ์ ์๋ฏธ
- ๋ฐ๋์ ํจ์๋ช
์ด ์ ์๋์ด ์์ด์ผ ํ๋ค.
ํจ์ ํํ์
- ์ ์ํ function์ ๋ณ๋์ ๋ณ์์ ํ ๋นํ๋ ๊ฒ์ ์๋ฏธ
- ํจ์๋ช
์ด ์์ด๋ ๋๋ค.
- ํจ์๋ช
์ ์ ์ํ ํํ์ : ๊ธฐ๋ช
ํจ์ ํํ์
- ํจ์๋ช
์ ์ ์ํ์ง ์์ ํํ์ : ์ต๋ช
ํจ์ ํํ์
โ ์ผ๋ฐ์ ์ผ๋ก ํจ์ ํํ์์ ์ต๋ช
ํจ์ ํํ์์ ์๋ฏธ
์์ 2-8) ํจ์๋ฅผ ์ ์ํ๋ ์ธ ๊ฐ์ง ๋ฐฉ์
function a () { }
a();
var b = function () { }
b();
var c = function d() { }
c();
d();
๊ธฐ๋ช
ํจ์ ํํ์์ ์ฃผ์ํ ์
- ์ธ๋ถ์์๋ ํจ์๋ช
์ผ๋ก ํจ์๋ฅผ ํธ์ถํ ์ ์๋ค.
- ํจ์๋ช
์ ์ค์ง ํจ์ ๋ด๋ถ์์๋ง ์ ๊ทผํ ์ ์๋ค.
์์ ๋ฅผ ํตํ ํจ์ ์ ์ธ๋ฌธ๊ณผ ํจ์ ํํ์์ ์ค์ง์ ์ธ ์ฐจ์ด
์์ 2-9) ํจ์ ์ ์ธ๋ฌธ๊ณผ ํจ์ ํํ์(1) - ์๋ณธ ์ฝ๋
console.log(sum(1,2));
console.log(multiply(3,4));
function sum (a, b) {
return a + b;
}
var multiply = function (a, b) {
return a * b;
}
์์ 2-10) ํจ์ ์ ์ธ๋ฌธ๊ณผ ํจ์ ํํ์(2) - ํธ์ด์คํ
์ ๋ง์น ์ํ
- ์คํ ์ปจํ
์คํธ์ LexicalEnvironment๋ ๋ ๊ฐ์ง ์ ๋ณด๋ฅผ ์์งํ๋๋ฐ, ๊ทธ ์ค enritonmentRecord์ ์ ๋ณด ์์ง ๊ณผ์ ์ค ๋ฐ์ํ๋ ํธ์ด์คํ
๊ณผ์ ์ ๋ํ ์ฝ๋
โ ํจ์ ์ ์ธ๋ฌธ์ ์ ์ฒด๋ฅผ ํธ์ด์คํ
, ๋ฐ๋ฉด ํจ์ ํํ์์ ๋ณ์ ์ ์ธ๋ถ๋ง ํธ์ด์คํ
โ ํจ์๋ ํ๋์ ๊ฐ์ผ๋ก ์ทจ๊ธํ ์ ์๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๋ ์ฝ๋
โ ํจ์ ํํ์ : ํจ์๋ฅผ ๋ค๋ฅธ ๋ณ์์ ๊ฐ์ผ๋ก์จ ํ ๋นํ๋ ๊ฒ
var sum = function sum (a, b) {
return a + b;
}
var multiply;
console.log(sum(1,2));
console.log(multiply(3,4));
multiply = function (a, b) {
return a * b;
}
์ค์ ์ฝ๋ ์คํ ๊ณผ์
[1] : ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณด, ํ๋ณด๋ ๊ณต๊ฐ์ ์ฃผ์๊ฐ์ ๋ณ์ sum์ ์ฐ๊ฒฐ
[2] : ๋ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณด, ๊ทธ ๊ณต๊ฐ์ ์ฃผ์๊ฐ์ ๋ณ์ multiply์ ์ฐ๊ฒฐ
(๋ค์)[1] : sum ํจ์๋ฅผ ๋ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ฅ, ๊ทธ ์ฃผ์๊ฐ์ ์์ ์ ์ธํ ๋ณ์ sum์ ๊ณต๊ฐ์ ํ ๋น
- ๋ณ์ sum์ ํจ์ sum์ ๋ฐ๋ผ๋ณด๋ ์ํ
[3] : sum์ ์คํ. ์ ์์ ์ผ๋ก ์คํ๋์ด 3 ์ถ๋ ฅ
[4] : ํ์ฌ multiply์๋ ๊ฐ์ด ํ ๋น๋์ด ์์ง ์์ ๋น์ด์๋ ๋์์ ํจ์๋ก ์ฌ๊ฒจ ์คํ ๋ช
๋ น์ ํ ๊ฒ
- 'multiply is not a function'์ด๋ผ๋ ์๋ฌ ๋ฉ์์ง ์ถ๋ ฅ
[5] : ์ด ํ์ ์ฝ๋๋ [4]์ ์๋ฌ๋ก ์ธํด ์คํ๋์ง ์์ ์ฑ ๋ฐํ์ ์ข
๋ฃ
ํจ์ ์ ์ธ๋ฌธ์ ์ํ์ฑ
- ํจ์ ์ ์ธ๋ฌธ์ ๊ฒฝ์ฐ ์ ์ธ ์ ์ ํธ์ถํด๋ ์๋ฌด๋ฐ ๋ฌธ์ ์์ด ์คํ
- ๋๋ช
์ ํจ์๊ฐ ์ฌ๋ฌ ๊ฐ์ผ ๊ฒฝ์ฐ, ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ ๋๋ฒ๊น
ํ๊ธฐ ์ด๋ ต๋ค.
- ๋๋ช
์ ํจ์๋ฅผ ํจ์ ํํ์์ผ๋ก ์ ์ ํ๋ค๋ฉด ๋์ค์ ์์ฑ๋ ํจ์ ํํ์์์ ์๋ฌ๊ฐ ๊ฒ์ถ๋์ด ๋๋ฒ๊น
์ด ์ฌ์์ง๋ค. (Uncaught Type Error: ํจ์ ์ด๋ฆ is not a function)
โ ์๋์ ์ผ๋ก ํจ์ ํํ์์ด ์์
์ํํ ํ์
์ ์ํด
- ์ ์ญ๊ณต๊ฐ์ ํจ์๋ฅผ ์ ์ธํ๋ค.
- ๋๋ช
์ ํจ์๋ฅผ ์ค๋ณต ์ ์ธํ์ง ์๋๋ก ํ๋ค.
- ํจ์ ํํ์์ ์ฌ์ฉํ๋ค.
์ค์ฝํ(scope)
- ์๋ณ์์ ๋ํ ์ ํจ๋ฒ์
- ์ด๋ค ๊ฒฝ๊ณ A์ ์ธ๋ถ์์ ์ ์ธํ ๋ณ์
- A์ ์ธ๋ถ๋ฟ ์๋๋ผ A์ ๋ด๋ถ์์๋ ์ ๊ทผ์ด ๊ฐ๋ฅ
- A์ ๋ด๋ถ์์ ์ ์ธํ ๋ณ์๋ ์ค์ง A์ ๋ด๋ถ์์๋ง ์ ๊ทผ ๊ฐ๋ฅ
ES5๊น์ง๋ ์ ์ญ๊ณต๊ฐ์ ์ ์ธํ๋ฉด ์ค์ง ํจ์์ ์ํด์๋ง ์ค์ฝํ๊ฐ ์์ฑ
ES6์์๋ ๋ธ๋ก์ ์ํด์๋ ์ค์ฝํ ๊ฒฝ๊ณ๊ฐ ๋ฐ์ํ๊ฒ ํ์ฌ ๋ค๋ฅธ ์ธ์ด์ ํจ์ฌ ๋น์ทํด์ง
- ๋ธ๋ก์ var๋ก ์ ์ธํ ๋ณ์์ ๋ํด ์์ฉํ์ง ์์
- ์๋ก ์๊ธด let, const, strict mode์ ํจ์ ์ ์ธ ๋ฑ์ ๋ํด์๋ง ๋ฒ์๋ก์์ ์ญํ ์ ์ํ
โ ์ด ๋์ ๊ตฌ๋ถํ๊ธฐ ์ํด ํจ์ ์ค์ฝํ, ๋ธ๋ก ์ค์ฝํ ๋ผ๋ ์ฉ์ด ์ฌ์ฉ
์ค์ฝํ ์ฒด์ธ(scope chain)
- '์๋ณ์์ ์ ํจ๋ฒ์'๋ฅผ ์์์ ๋ฐ๊นฅ์ผ๋ก ์ฐจ๋ก๋ก ๊ฒ์ํด๋๊ฐ๋ ๊ฒ
- ์ค์ฝํ ์ฒด์ธ์ ๊ฐ๋ฅํ๋ ํ๋ ๊ฒ โ LexicalEnvironment ์ ๋ ๋ฒ์งธ ์์ง ์๋ฃ์ธ outerEnvironmentReference
outerEnvironmentReference
- outerEnvironmentReference๋ ํ์ฌ ํธ์ถ๋ ํจ์๊ฐ ์ ์ธ๋ ๋น์์ LexicalEnvironment๋ฅผ ์ฐธ์กฐ
๊ณผ๊ฑฐ ์์ ์ธ '์ ์ธ๋ ๋น์'์ ์ฃผ๋ชฉ
- '์ ์ธํ๋ค'๋ผ๋ ํ์๊ฐ ์ค์ ๋ก ์ผ์ด๋ ์ ์๋ ์์ = ์ฝ ์คํ ์์์ ์ด๋ค ์คํ ์ปจํ
์คํธ๊ฐ ํ์ฑํ๋ ์ํ์ผ ๋
โ ์ด๋ค ํจ์๋ฅผ ์ ์ธ(์ ์)ํ๋ ํ์ ์์ฒด๋ ํ๋์ ์ฝ๋์ด๊ณ , ๋ชจ๋ ์ฝ๋๋ ์คํ ์ปจํ
์คํธ๊ฐ ํ์ฑํ ์ํ์ผ ๋ ์คํ๋๊ธฐ ๋๋ฌธ
์์) A ํจ์ ๋ด๋ถ์ B ํจ์ ์ ์ธ, B ํจ์ ๋ด๋ถ์ C ํจ์ ์ ์ธ
- ํจ์ C์ outerEnvironmentReference๋ ํจ์ B์ LexicalEnvironment๋ฅผ ์ฐธ์กฐ
- ํจ์ B์ LexicalEnvironment์ ์๋ outerEnvironmentReference๋ ํจ์๋ ํจ์ B๊ฐ ์ ์ธ๋๋ ๋ A์ LexicalEnvironment๋ฅผ ์ฐธ์กฐ
โ outerEnvironmentReference๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ(linked-list)ํํ
- '์ ์ธ ์์ ์ LexicalEnvironment'๋ฅผ ๊ณ์ ์ฐพ์ ์ฌ๋ผ๊ฐ๋ฉด ๋ง์ง๋ง์ ์ ์ญ ์ปจํ
์คํธ์ LexicalEnvironment๊ฐ ์์ ๊ฒ์ด๋ค.
- ๊ฐ outerEnvironmentReference๋ ์ค์ง ์์ ์ด ์ ์ธ๋ ์์ ์ LexicalEnvironment๋ง ์ฐธ์กฐํ๋ฏ๋ก, ๊ฐ์ฅ ๊ฐ๊น์ด ์์๋ก๋ถํฐ ์ฐจ๋ก๋๋ก๋ง ์ ๊ทผํ ์ ์๊ณ ๋ค๋ฅธ ์์๋ก ์ ๊ทผํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅ
โ ์ด๋ฐ ๊ตฌ์กฐ์ ํน์ฑ์ผ๋ก ์ธํด ์ฌ๋ฌ ์ค์ฝํ์์ ๋์ผํ ์๋ณ์๋ฅผ ์ ์ธํ ๊ฒฝ์ฐ, ๋ฌด์กฐ๊ฑด ์ค์ฝํ ์ฒด์ธ ์์์ ๊ฐ์ฅ ๋จผ์ ๋ฐ๊ฒฌ๋ ์๋ณ์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
์์ 2-13) ์ค์ฝํ ์ฒด์ธ
var a = 1;
var outer = function () {
var inner = function () {
consolt.log(a);
var a = 3;
};
inner();
console.log(a);
}
outer();
console.log(a);
-
์์
- ์ ์ญ ์ปจํ
์คํธ ํ์ฑํ : ์ ์ญ ์ปจํ
์คํธ์ environmentRecord์ {a, outer} ์๋ณ์ ์ ์ฅ
- ์ ์ญ ์ปจํ
์คํธ๋ ์ ์ธ ์์ ์ด ์์ผ๋ฏ๋ก ์ ์ญ ์ปจํ
์คํธ์ outerEnvironmentReference์๋ ์๋ฌด๊ฒ๋ ๋ด๊ธฐ์ง ์๋๋ค. (this: ์ ์ญ ๊ฐ์ฒด)
-
[1], [2] : ์ ์ญ ์ค์ฝํ์ ์๋ ๋ณ์ a์ 1์ outer์ ํจ์๋ฅผ ํ ๋น
-
[3] : outer ํจ์ ํธ์ถ
- ์ ์ญ ์ปจํ
์คํธ์ ์ฝ๋๋ [3]์์ ์์ ์ค๋จ
- outer ์คํ ์ปจํ
์คํธ๊ฐ ํ์ฑํ๋์ด [2]๋ก ์ด๋
-
[2]
- outer ์ปจํ
์คํธ์ environmentRecord์ {inner} ์๋ณ์ ์ ์ฅ
- outerEnvironmentReference์๋ outer ํจ์๊ฐ ์ ์ธ๋ ๋น์์ LexicalEnvironment๊ฐ ๋ด๊ธด๋ค.
- outer ํจ์๋ ์ ์ญ ๊ณต๊ฐ์์ ์ ์ธ๋์ผ๋ฏ๋ก ์ ์ญ ์ปจํ
์คํธ์ LexicalEnvironment๋ฅผ ์ฐธ์กฐ๋ณต์ฌ
โ ์ด๋ฅผ [GLOBAL, {a, outer}]๋ผ๊ณ ํ๊ธฐ (this: ์ ์ญ ๊ฐ์ฒด)
- GLOBAL : ์คํ ์ปจํ
์คํธ์ ์ด๋ฆ
- {a, outer} : environmentRecord์ ๊ฐ์ฒด
-
[4] : outer ์ค์ฝํ์ ์๋ ๋ณ์ inner์ ํจ์๋ฅผ ํ ๋น
-
[5] : inner ํจ์ ํธ์ถ
- outer ์ปจํ
์คํธ์ ์ฝ๋๋ [5]์์ ์์ ์ค๋จ
- inner ์คํ ์ปจํ
์คํธ๊ฐ ํ์ฑํ๋์ด [4]๋ก ์ด๋
-
[4]
- inner ์ปจํ
์คํธ์ environmentRecord์ {a} ์๋ณ์ ์ ์ฅ
- outerEnvironmentReference์๋ inner ํจ์๊ฐ ์ ์ธ๋ ๋น์์ LexicalEnvironment๊ฐ ๋ด๊ธด๋ค.
- inner ํจ์๋ outer ํจ์ ๋ด๋ถ์์ ์ ์ธ๋์ผ๋ฏ๋ก outer ํจ์์ LexicalEnvironment๋ฅผ ์ฐธ์กฐ๋ณต์ฌ
โ [outer, {a}] (this: ์ ์ญ ๊ฐ์ฒด)
-
[6] : ์๋ณ์ a ์ ์ ๊ทผ
- ํ์ฌ ํ์ฑํ ์ํ์ธ inner ์ปจํ
์คํธ์ environmentRecord์์ a๋ฅผ ๊ฒ์
- a๊ฐ ๋ฐ๊ฒฌ๋๋๋ฐ ์ฌ๊ธฐ์๋ ์์ง ํ ๋น๋ ๊ฐ์ด ์์
โ undefined
์ถ๋ ฅ
-
[7] : inner ์ค์ฝํ์ ์๋ ๋ณ์ a์ 3์ ํ ๋น
-
[8] : inner ํจ์ ์คํ ์ข
๋ฃ
- inner ์คํ ์ปจํ
์คํธ๊ฐ ์ฝ ์คํ์์ ์ ๊ฑฐ
- ๋ฐ๋ก ์๋์ outer ์คํ ์ปจํ
์คํธ๊ฐ ๋ค์ ํ์ฑํ
- ์ค๋จํ๋ [5]์ ๋ค์์ผ๋ก ์ด๋
-
[9] : ์๋ณ์ a ์ ์ ๊ทผ
- ์ด ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํ์ฑํ๋ ์คํ ์ปจํ
์คํธ์ LexicalEnvironment์ ์ ๊ทผ
- ์ฒซ ์์์ environmentRecord์์ a ๊ฐ ์๋์ง ์ฐพ์๋ณด๊ณ , ์์ผ๋ฉด outerEnvironmentReference์ ์๋ environmentRecord๋ก ๋์ด๊ฐ๋ ๋ฐฉ์์ผ๋ก ๊ฒ์ ์งํ
- ์ ์ญ LexicalEnvironment์ a๊ฐ ์์ผ๋ ๊ทธ a์ ์ ์ฅ๋ ๊ฐ 1์ ๋ฐํ
โ 1
์ถ๋ ฅ
-
[10] : outer ํจ์ ์คํ ์ข
๋ฃ
- outer ์คํ ์ปจํ
์คํธ๊ฐ ์ฝ ์คํ์์ ์ ๊ฑฐ
- ๋ฐ๋ก ์๋์ ์ ์ญ ์ปจํ
์คํธ๊ฐ ๋ค์ ํ์ฑํ
- ์ค๋จํ๋ [3]์ ๋ค์์ผ๋ก ์ด๋
-
[11] : ์๋ณ์ a ์ ์ ๊ทผ
- ํ์ฌ ํ์ฑํ ์ํ์ธ ์ ์ญ ์ปจํ
์คํธ์ environmentRecord์์ a๋ฅผ ๊ฒ์ํ์ฌ a๋ฅผ ์ฐพ์
โ 1
์ถ๋ ฅ
- ๋ชจ๋ ์ฝ๋์ ์คํ์ด ์๋ฃ๋์ด ์ ์ญ ์ปจํ
์คํธ๊ฐ ์ฝ ์คํ์์ ์ ๊ฑฐ๋๊ณ ์ข
๋ฃ
์์ 2-13) ์ค์ฝํ ์ฒด์ธ ๋ด์ฉ ์ ๋ฆฌ
- '์ ์ญ ์ปจํ
์คํธ โฃ outer ์ปจํ
์คํธ โฃ inner ์ปจํ
์คํธ' ์์ผ๋ก ์ ์ฐจ ๊ท๋ชจ๊ฐ ์์์ง๋ค
- ๋ฐ๋ฉด ์ค์ฝํ ์ฒด์ธ์ ํ๊ณ ์ ๊ทผ ๊ฐ๋ฅํ ๋ณ์์ ์๋ ๋์ด๋๋ค.
- ์ ์ญ ๊ณต๊ฐ์์ ์ ์ญ ์ค์ฝํ์์ ์์ฑ๋ ๋ณ์์๋ง ์ ๊ทผ ๊ฐ๋ฅ
- outer ํจ์ ๋ด๋ถ์์๋ outer, ์ ์ญ ์ค์ฝํ์์ ์์ฑ๋ ๋ณ์์ ์ ๊ทผ ๊ฐ๋ฅ
- inner ํจ์ ๋ด๋ถ์์๋ inner, outer, ์ ์ญ ์ค์ฝํ ๋ชจ๋์ ์ ๊ทผ ๊ฐ๋ฅ
๋ณ์ ์๋ํ(variable shadowing)
- ์ค์ฝํ ์ฒด์ธ ์์ ์๋ ๋ณ์๋ผ๊ณ ํด์ ๋ฌด์กฐ๊ฑด ์ ๊ทผ ๊ฐ๋ฅํ ๊ฒ์ ์๋๋ค.
- ์์ 2-13์์ ์๋ณ์ a๋ ์ ์ญ ๊ณต๊ฐ, inner ํจ์ ๋ด๋ถ์์ ์ ์ธ
- inner ํจ์ ๋ด๋ถ์์ a์ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด ์ค์ฝํ ์ฒด์ธ ์์ ์ฒซ ๋ฒ์งธ ์ธ์์ธ inner ์ค์ฝํ์ LexicalEnvironment๋ถํฐ ๊ฒ์ํ๊ณ , a ์๋ณ์๊ฐ ์กด์ฌํ๋ฉด ์ค์ฝํ ์ฒด์ธ ๊ฒ์์ ๋ฉ์ถ๊ณ inner LexicalEnvironment ์์ a๋ฅผ ๋ฐํ
โ ์ฆ, inner ํจ์ ๋ด๋ถ์์ a ๋ณ์๋ฅผ ์ ์ธํ๊ธฐ ๋๋ฌธ์ ์ ์ญ ๊ณต๊ฐ์์ ์ ์ธํ a ๋ณ์์ ์ ๊ทผํ ์ ์๊ณ ์ด๋ฅผ ๋ณ์ ์๋ํ๋ผ๊ณ ํ๋ค.
์ ์ญ๋ณ์์ ์ง์ญ๋ณ์
- ์ ์ญ๋ณ์ : ์ ์ญ ์ค์ฝํ์์ ์ ์ธํ ๋ณ์
- ์ง์ญ๋ณ์ : ํจ์ ๋ด๋ถ์์ ์ ์ธํ ๋ณ์
โ ์ฝ๋์ ์์ ์ฑ์ ์ํด ๊ฐ๊ธ์ ์ ์ญ๋ณ์ ์ฌ์ฉ์ ์ต์ํํ๋ ๊ฒ์ด ์ข๋ค.
this
- ์คํ ์ปจํ
์คํธ์ ThisBinding์๋
this
๋ก ์ง์ ๋ ๊ฐ์ฒด๊ฐ ์ ์ฅ
- ์คํ ์ปจํ
์คํธ ํ์ฑํ ๋น์
this
๊ฐ ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ, this
๋ ์ ์ญ ๊ฐ์ฒด๊ฐ ์ ์ฅ
- ๊ทธ ๋ฐ์๋ ํจ์๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ
this
์ ์ ์ฅ๋๋ ๋์์ด ๋ฌ๋ผ์ง๋ค.
this
์ ๋ํ ์์ธํ ๋ด์ฉ์ What is 'this' in JavaScript?์ ์ ๋ฆฌํ์ต๋๋ค.
์ ๋ฆฌ
-
์คํ ์ปจํ
์คํธ : ์คํํ ์ฝ๋์ ์ ๊ณตํ ํ๊ฒฝ ์ ๋ณด๋ค์ ๋ชจ์๋์ ๊ฐ์ฒด
- ์ ์ญ ์ปจํ
์คํธ : ์ ์ญ ๊ณต๊ฐ์์ ์๋์ผ๋ก ์์ฑ
- eval ๋ฐ ํจ์ ์คํ์ ์ํ ์ปจํ
์คํธ ๋ฑ
-
์คํ ์ปจํ
์คํธ ๊ฐ์ฒด๋ ํ์ฑํ๋๋ ์์ ์ VariableEnvironment, LexicalEnvironment, ThisBinding์ ์ธ ๊ฐ์ง ์ ๋ณด๋ฅผ ์์ง
- ์คํ ์ปจํ
์คํธ๋ฅผ ์์ฑํ ๋ VariableEnvironment์ LexicalEnvironment๋ ๋์ผํ ๋ด์ฉ์ผ๋ก ๊ตฌ์ฑ๋์ง๋ง
- LexicalEnvironment : ํจ์ ์คํ ๋์ค์ ๋ณ๊ฒฝ๋๋ ์ฌํญ์ด ์ฆ์ ๋ฐ์
- environmentRecord์ outerEnvironmentReference๋ก ๊ตฌ์ฑ
- environmentRecord : ์ ์ธํ ํจ์์ ํจ์๋ช
๋ฑ์ ์์ง
- outerEnvironmentReference : LexicalEnvironment ์ ๋ณด๋ฅผ ์ฐธ์กฐ
- VariableEnvironment : ์ด๊ธฐ ์ํ ์ ์ง
-
ํธ์ด์คํ
- ์ฝ๋ ํด์์ ์ข ๋ ์์ํ๊ฒ ํ๊ธฐ ์ํด environmentRecord์ ์์ง ๊ณผ์ ์ ์ถ์ํํ ๊ฐ๋
- ์คํ ์ปจํ
์คํธ๊ฐ ๊ด์ฌํ๋ ์ฝ๋ ์ง๋จ์ ์ต์๋จ์ผ๋ก ์ด๋ค์ '๋์ด์ฌ๋ฆฐ๋ค'๊ณ ํด์ํ๋ ๊ฒ
- ๋ณ์ ์ ์ธ๊ณผ ๊ฐ ํ ๋น์ด ๋์์ ์ด๋ค์ง ๋ฌธ์ฅ : '์ ์ธ๋ถ'๋ง ํธ์ด์คํ
(ํ ๋น ๊ณผ์ ์ ์๋ ์๋ฆฌ์ ์์น)
- ์ฌ๊ธฐ์ ํจ์ ์ ์ธ๋ฌธ๊ณผ ํจ์ ํํ์์ ์ฐจ์ด๊ฐ ๋ฐ์
-
์ค์ฝํ : ๋ณ์์ ์ ํจ๋ฒ์
- outerEnvironmentReference๋ ํด๋น ํจ์๊ฐ ์ ์ธ๋ ์์น์ LexicalEnvironment๋ฅผ ์ฐธ์กฐ
- ์ฝ๋ ์์์ ์ด๋ค ๋ณ์์ ์ ๊ทผํ ๋, ํ์ฌ ์ปจํ
์คํธ์ LexicalEnvironment๋ฅผ ํ์ํ์ฌ ๋ฐ๊ฒฌ๋๋ฉด ๊ทธ ๊ฐ์ ๋ฐํํ๊ณ , ๋ฐ๊ฒฌํ์ง ๋ชปํ ๊ฒฝ์ฐ ๋ค์ outerEnvironmentReference์ ๋ด๊ธด LexicalEnvironment๋ฅผ ํ์ํ๋ ๊ณผ์ ์ด ๋ฐ๋ณต
- ์ ์ญ ์ปจํ
์คํธ์ LexicalEnvironment๊น์ง ํ์ํด๋ ํด๋น ๋ณ์๋ฅผ ์ฐพ์ง ๋ชปํ ๊ฒฝ์ฐ
undefined
๋ฅผ ๋ฐํ
-
์ ์ญ๋ณ์์ ์ง์ญ๋ณ์
- ์ ์ญ๋ณ์ : ์ ์ญ ์ปจํ
์คํธ์ LexicalEnvironment์ ๋ด๊ธด ๋ณ์
- ์ง์ญ๋ณ์ : ๊ทธ ๋ฐ์ ํจ์์ ์ํด ์์ฑ๋ ์คํ ์ปจํ
์คํธ์ ๋ณ์
โ ์์ ํ ์ฝ๋ ๊ตฌ์ฑ์ ์ํด ๊ฐ๊ธ์ ์ ์ญ๋ณ์์ ์ฌ์ฉ ์ต์ํ
-
this
- ์คํ ์ปจํ
์คํธ๋ฅผ ํ์ฑํํ๋ ๋น์์ ์ง์ ๋ this๊ฐ ์ ์ฅ
- ํจ์๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ๊ฐ์ด ๋ฌ๋ผ์ง
- ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ ์ ์ญ ๊ฐ์ฒด๊ฐ ์ ์ฅ
์ฐธ๊ณ
๋ง๋ฌด๋ฆฌ
- ์ด ๊ธ๋ง ๋ณด๊ณ ๋ ์ฑ
์ ๋ด์ฉ์ฒ๋ผ ์ ์ดํดํ ์ ์๋๋ก ์ ๋ฆฌํ๋ ค๋ค๋ณด๋ ์ฑ
์ ๊ทธ๋ฅ ์ฎ๊ธฐ๋ ์์ค์ผ๋ก ์ ๋ฆฌํ ๊ฒ์ด ์๋๊ฐ ํ๋ ์๊ฐ์ด ๋ ๋ค.
โ ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ฑ
์ด ๋ ์์ธํ๊ฒ ์ค๋ช
๋์ด ์์ต๋๋ค. ํํ
- ์ฝ๋ฐฑ ํจ์๋ฅผ ์์์ผ๋ก ์ฐ๊ด๋ ๋ถ๋ถ์ ์ด์ด์ ์ ๋ฆฌํ๋ ค๊ณ ํ๋ค๋ณด๋ ๋ค์ ์ฝ์ด์๋ฐ์คํฌ๋ฆฝํธ ์ ๋ฆฌ ๋ด์ฉ์ ํด๋ก์ ๊ฐ ๋๊ฒ ์ต๋๋ค.
๋๋ฐ