๐ฆ Execution Context โ
01. ์คํ ์ปจํ ์คํธ๋? โ
์คํ ์ปจํ
์คํธ๋, ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ํด ํ์ํ ํ๊ฒฝ ์ ๋ณด
(์ค์ฝํ, ๋ณ์, this ๋ฑ)๋ฅผ ๋ด๊ณ ์๋ ๋ด๋ถ ๊ตฌ์กฐ์ด๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์คํ ์ปจํ
์คํธ๋ฅผ ํตํด ์ฝ๋๋ฅผ ์ด๋ค ์์๋ก ์คํํ ์ง, ๋ณ์๋ฅผ ์ด๋ป๊ฒ ์ฐพ์์ง, this๋ ๋ฌด์์ ๊ฐ๋ฆฌํฌ์ง ๋ฑ์ ๊ฒฐ์ ํ๋ค.
- ๊ฐ์ ์คํ ์ปจํ ์คํธ ๋ด์์๋ ๋์ผํ ํ๊ฒฝ์ ๊ณต์ ํ๋ค.
- ์ปจํ ์คํธ๊ฐ ์ ํ๋๋ฉด ์๋ก์ด ์คํ ํ๊ฒฝ์ด ๊ตฌ์ฑ๋๋ค.
1-1. ์คํ๊ณผ ํ โ
์คํ๊ณผ ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊บผ๋ด๋ ๋ฐฉ์์ ๋ฐ๋ผ ๊ตฌ๋ถ๋๋
์ ํ ์๋ฃ๊ตฌ์กฐ(linear data structure)
.
์คํ (Stack) ๐ฅ โ
- ๋ฐ์ดํฐ๋ฅผ ์๋ก ์๋ ๊ตฌ์กฐ์ด๋ค
- ๊ฐ์ฅ ๋์ค์ ๋ฃ์ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ฅ ๋จผ์ ๋์ค๋
LIFO
(Last In, First Out) ๊ตฌ์กฐ์ด๋ค. - ๋ํ ๋ฉ์๋: push(), pop()
ํ (Queue) ๐ถโโ๏ธ๐ถโโ๏ธ๐ถโโ๏ธ๐ถโโ๏ธ โ
- ๋ฐ์ดํฐ๋ฅผ ์ค ์ธ์ ์ฒ๋ฆฌํ๋ ๊ตฌ์กฐ์ด๋ค.
- ๊ฐ์ฅ ๋จผ์ ๋ฃ์ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ฅ ๋จผ์ ๋์ค๋
FIFO
(First In, First Out) ๊ตฌ์กฐ - ๋ํ ๋ฉ์๋: push(), shift()
์คํ ์ปจํ ์คํธ๋ฅผ ๊ตฌ์ฑํ ์ ์๋ ๋ฐฉ๋ฒ โ
์ ์ญ ๊ณต๊ฐ (Global Context)
: ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ด ์ฒ์ ๋ก๋๋ ๋ ์์ฑ๋๋ค.ํจ์ ํธ์ถ (Function Context)
: ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค ์๋ก์ด ์คํ ์ปจํ ์คํธ๊ฐ ๋ง๋ค์ด์ง๋ค.๋ชจ๋ (Module)
: ๋ชจ๋์ด import๋๋ ์๊ฐ, ํด๋น ๋ชจ๋์ ๋ํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๋ค.eval() ์ฌ์ฉ ๋น๊ถ์ฅ
: ๋ฌธ์์ด ์ฝ๋๋ฅผ ๋ฐํ์์ ์คํํ๋ ๊ฒฝ์ฐ ๋ณ๋์ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ์คํ ์ปจํ
์คํธ๋ฅผ ์์ฑํ ์ ์๋ ์ค์ง์ ์ธ ์ฝ๋ ๋จ์๋ ํจ์
์ด๋ค.
๋ฐ๋ผ์ ์๋ฐ์คํฌ๋ฆฝํธ์ ์คํ ํ๊ฒฝ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํจ์ ๋จ์
๋ก ๋๋๋ค๊ณ ๋ณผ ์ ์๋ค.
๐ก ๋ธ๋ก ์ค์ฝํ โ ์คํ ์ปจํ ์คํธ
์กฐ๊ฑด๋ฌธ์ด๋ ๋ฐ๋ณต๋ฌธ ๋ฑ ๋ธ๋ก๋ฌธ์ ๋ธ๋ก ์ค์ฝํ๋ ํ์ฑํ์ง๋ง, ๋ณ๋์ ์คํ ์ปจํ ์คํธ๋ฅผ ์์ฑํ์ง ์๋๋ค.
1-2. ์คํ ์ปจํ ์คํธ์ ์ฝ ์คํ โ
์๋ ์ฝ๋๋ ํจ์ ํธ์ถ์ ๋ฐ๋ผ ์คํ ์ปจํ
์คํธ๊ฐ ์์ฑ๋๊ณ ์ ๊ฑฐ๋๋ ํ๋ฆ์ ๋ณด์ฌ์ค๋ค.
์คํ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ฝ์ ์ถ๋ ฅ ํ๋ฆ์ผ๋ก ๋ณด๋ ์คํ ๊ฒฐ๊ณผ โ
outer()
ํจ์ ํธ์ถ
- ๋ด๋ถ์์
inner()
ํธ์ถ
- ๋ด๋ถ์์
inner()
์ข ๋ฃ ํ ๋ค์outer()
๋ด๋ถ ์งํ
- ๋ชจ๋ ์คํ์ด ๋๋๊ณ ์ ์ญ์์ ๋ง์ง๋ง
console.log(a)
- ๋ชจ๋ ์คํ์ด ๋๋๊ณ ์ ์ญ์์ ๋ง์ง๋ง
๐ ์๋์์ ๋ ๋ํ ์ผํ๊ฒ ํ์ธํด๋ณด์.
์คํ ์ปจํ ์คํธ์ ์ฝ ์คํ ์๊ฐํ โ
์๋ฐ์คํฌ๋ฆฝํธ๋ ํจ์๋ฅผ ์คํํ ๋๋ง๋ค ์คํ ์ปจํ
์คํธ
๋ฅผ ์์ฑํ๊ณ , ์ด๋ฅผ ์ฝ ์คํ(Call Stack)
์ ์์ ์คํ ํ๋ฆ์ ๊ด๋ฆฌํ๋ค.
- ์ฝ๋ ์คํ ์
์ ์ญ ์คํ ์ปจํ ์คํธ
๊ฐ ์์ฑ๋์ด ์ฝ ์คํ์ ์ง์ ํ๋ค. - ์ดํ ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค ์๋ก์ด ์คํ ์ปจํ
์คํธ๊ฐ ์์ฑ๋์ด
์ฝ ์คํ์ push
๋๋ค. - ํจ์ ์คํ์ด ๋๋๋ฉด ํด๋น ์ปจํ
์คํธ๋
์ฝ ์คํ์์ pop
๋์ด ์ ๊ฑฐ๋๋ฉฐ, ์ด์ ์ปจํ ์คํธ๋ก ๋ณต๊ทํ๋ค.
๐ก ํ๋ฆ ์ ๋ฆฌ
outer()
๊ฐ ํธ์ถ๋๋ฉด ์ฝ ์คํ์ ๋งจ ์๋ก ์ฌ๋ผ๊ฐ๊ณ , ์ ์ญ ์ปจํ ์คํธ ์คํ์์ผ์ ์ ์ง
๋๋ค.outer()
๋ด๋ถ์์inner()
๊ฐ ํธ์ถ๋๋ฉด, ๋ ๋ค์inner์ ์ปจํ ์คํธ๊ฐ ์คํ์ ๋งจ ์์ ์ฌ๋ผ๊ฐ๋ค
.inner()
์คํ์ด ๋๋๋ฉด pop โ ๋ค์outer()
โ pop โ ๋ค์ ์ ์ญ ์ปจํ ์คํธ ์คํ.
์ฆ, ์ฝ ์คํ์ ๋งจ ์์ ์๋ ์ปจํ
์คํธ๋ง ์คํ ์ค
์ด๊ณ , ๋๋จธ์ง๋ ๋๊ธฐ ์ํ์ด๋ค.
์ฝ ์คํ์ ๋ณํ ๊ณผ์ โ
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํจ์ ํธ์ถ ์๋ง๋ค ์คํ ์ปจํ ์คํธ๋ฅผ ์์ฑํ๊ณ ์ฝ ์คํ์ pushํ๋ค.
- ์คํ์ด ์๋ฃ๋๋ฉด ์ฝ ์คํ์์ pop๋์ด ์ ๊ฑฐ๋๋ฉฐ, ์ด์ ์ปจํ ์คํธ๋ก ๋ณต๊ทํ๋ค.
- ์ฝ ์คํ์ด ๋ฌดํํ ์์ด๋ฉด
Maximum call stack size exceeded
์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
์คํ๊ณผ ์ฝ ์คํ์ ์ฐจ์ด๋?
- ์คํ(Stack): ๋ฐ์ดํฐ๋ฅผ ์๊ณ ๊บผ๋ด๋
์๋ฃ๊ตฌ์กฐ์ ๊ฐ๋
์ด๋ค. - ์ฝ ์คํ(Call Stack):์คํ ๊ฐ๋ ์ด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง ๋ด๋ถ์์ ํจ์ ์คํ ํ๋ฆ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ ์ฉ๋ ์์คํ ๊ตฌ์กฐ์ด๋ค.
ํจ์๊ฐ ํธ์ถ๋๋ฉด ์คํ ์ปจํ ์คํธ๊ฐ ์ฝ ์คํ์ push๋๊ณ , ์คํ์ด ์ข ๋ฃ๋๋ฉด pop๋์ด ์ ๊ฑฐ๋๋ค.
์ฆ, ์คํ์ ์๋ฃ๊ตฌ์กฐ์ ๊ฐ๋ ์ด๊ณ ์ฝ ์คํ์ ๊ทธ ๊ฐ๋ ์ด ์ค์ ํจ์ ์คํ ํ๋ฆ ๊ด๋ฆฌ์ ์ ์ฉ๋ ์์คํ ๊ตฌ์ฑ์ด๋ค.
02. ์คํ ์ปจํ ์คํธ ๋ด๋ถ ๊ตฌ์กฐ โ
Execution Context ๊ตฌ์ฑ ์์ โ
๐ณ๏ธ Variable Environment
: ํ์ฌ ์ปจํ ์คํธ ๋ด์ ์๋ณ์ ์ ๋ณด์ ์ธ๋ถ ํ๊ฒฝ ์ฐธ์กฐ๋ฅผ ํฌํจํ๋ค.
์ ์ธ ์์ ์ Lexical Environment์ ๐ธ์ค๋ ์ท์ผ๋ก, ์ดํ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์๋์ง ์๋๋ค.๐ณ๏ธ Lexical Environment
: ์ด๊ธฐ์๋ Variable Environment์ ๋์ผํ์ง๋ง,
๋ณ๊ฒฝ ์ฌํญ์ด ์ค์๊ฐ์ผ๋ก ๋ฐ์๋๋ฉฐ ๋ณ์ ๊ฐ ์ถ์ ์ด ๊ฐ๋ฅํ๋ค.๐ This Binding
: ํด๋น ์คํ ์ปจํ ์คํธ์์ this๊ฐ ์ฐธ์กฐํด์ผ ํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
๐ Dmitry Soshnikov์ Lexical Environment
ES5 ์ฌ์์ ๊ธฐ๋ฐ์ผ๋ก Lexical Environment ๊ฐ๋ ์ JS ์ฝ๋์ ํจ๊ป ์ค๋ช ํ ์ฐธ๊ณ ๋ธ๋ก๊ทธ. ใ์ฝ์ด ์๋ฐ์คํฌ๋ฆฝํธใ๋ ์ด ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์ค๋ช ์ด ๊ตฌ์ฑ๋์ด ์๋ค.
03. VariableEnvironment โ
์คํ ์ปจํ
์คํธ๊ฐ ์์ฑ๋ ๋,
Variable Environment
์ ์ ๋ณด๋ฅผ ์์งํ ๋ค,
๊ทธ ๋ด์ฉ์ ๊ทธ๋๋ก ๋ณต์ฌํด Lexical Environment
๋ฅผ ๊ตฌ์ฑํ๋ค.
์ดํ์๋ ์ฃผ๋ก Lexical Environment
๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๋ ๊ตฌ์กฐ๋ ๋ด๋ถ์ ์ผ๋ก ๋ชจ๋ ๋ค์๊ณผ ๊ฐ์ ๊ณตํต ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค.
Execution Context
โโโ ๐ณ๏ธ Variable Environment
โ โโโ Environment Record(snapshot)
โ โโโ Outer Environment Reference(snapshot)
โ
โโโ ๐ณ๏ธ Lexical Environment
โ โโโ Environment Record
โ โโโ Outer Environment Reference
โ
โโโ ๐ This Binding
04. LexicalEnvironment โ
Lexical Environment
๋ ์คํ ์ปจํ
์คํธ๋ฅผ ๊ตฌ์ฑํ๋ 'ํ๊ฒฝ ์ ๋ณด๋ค์ ์งํฉ ๊ฐ์ฒด'์ด๋ค.
์คํ ์ค ๋ณ์์ ๊ฐ์ ์ค์๊ฐ์ผ๋ก ์ถ์ ํ๋ ํต์ฌ ๊ตฌ์กฐ๋ค.
๐ก ์ด ๊ตฌ์กฐ๋ ํด๋ก์ , ์ค์ฝํ ์ฒด์ธ, this ๋ฐ์ธ๋ฉ ๋์ ๋ฐฉ์์ ํต์ฌ ๊ธฐ๋ฐ์ด ๋๋ค!
Environment Record
: ํ์ฌ ์ปจํ ์คํธ ๋ด๋ถ์์ ์ ์ธ๋ ์๋ณ์ ์ ๋ณด(๋ณ์, ํจ์ ๋ฑ)Outer Environment Reference
: ์์ ์ค์ฝํ๋ฅผ ์ฐธ์กฐํด '์ค์ฝํ ์ฒด์ธ'์ ๊ตฌ์ฑํ ์ ์๋๋ก ๋๋ ์ฐ๊ฒฐ ์ ๋ณด
4-1. EnvironmentRecord์ ํธ์ด์คํ โ
Environment Record
๋ ํ์ฌ ์คํ ์ปจํ
์คํธ์ ์๋ณ์ ์ ๋ณด๋ฅผ ์์งํ๋ ๊ณต๊ฐ์ด๋ค.
์คํ ์ปจํ
์คํธ๊ฐ ์์ฑ๋ ๋, ์์ง์ ์ด ์ ๋ณด๋ฅผ ๊ฐ์ฅ ๋จผ์ ์์งํ๋ฉฐ ์ด ๊ณผ์ ์ ํํ ํธ์ด์คํ
(Hoisting)์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๐ก ํธ์ด์คํ ์ ์ค์ ์ฝ๋ ์ด๋์ด ์๋, ์๋ณ์ ์ ๋ณด๊ฐ ๋ฏธ๋ฆฌ ๋ฑ๋ก๋๋ ํ์์ ์ค๋ช ํ๊ธฐ ์ํ ๊ฐ๋ ์ ํํ์ด๋ค.
๐ ํธ์ด์คํ ๊ท์น โ
๋งค๊ฐ๋ณ์์ ๋ณ์์ ๋ํ ํธ์ด์คํ
ํจ์๊ฐ ์คํ๋๊ธฐ ์ , ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์คํ ์ปจํ
์คํธ๋ฅผ ์์ฑํ๊ณ EnvironmentRecord
์ ์๋ณ์๋ค์ ๋ค์ ์์๋๋ก ์ฌ์ ์ ๋ฑ๋กํ๋ค.
- ๋งค๊ฐ๋ณ์ x โ
์ธ์ 1
๊ณผ ๋ฐ์ธ๋ฉ๋์ดx: 1
๋ก ๋ฑ๋ก
- ๋งค๊ฐ๋ณ์ x โ
var x;
์ ์ธ โ ์ด๋ฏธx
๊ฐ ์์ผ๋ฏ๋ก ์ค๋ณต ์ ์ธ์ ๋ฌด์
var x = 2
โ ์ ์ธ์ ๋ฌด์๋๊ณ , ์คํ ๋จ๊ณ์์x = 2
ํ ๋น๋ง ์ ์ฉ
๋ฐ๋ผ์ ์ต์ข
์ ์ผ๋ก EnvironmentRecord์๋ ๋งค๊ฐ๋ณ์ x
ํ๋๋ง ๋ฑ๋ก๋๊ณ ,
๋ชจ๋ var ์ ์ธ์ ๋ฌด์๋๋ฉฐ, ์ดํ ์คํ ๋จ๊ณ์์ x = 2
๋ง ์ฌํ ๋น๋๋ค.
ํจ์ ์ ์ธ์ ํธ์ด์คํ
ํจ์ ์ ์ธ๋ฌธ์ ๋ณ์ ์ ์ธ๋ณด๋ค ๋จผ์ EnvironmentRecord
์ ๋ฑ๋ก๋๋ฉฐ, ์ ์ธ๊ณผ ๋์์ ํจ์ ์ ์ฒด๊ฐ ๋ฐ์ธ๋ฉ๋๋ค.
function b()
โ ํจ์ ์ ์ธ์ด ๊ฐ์ฅ ๋จผ์ ์์ง โb: function b() {}
๋ก ๋ฑ๋ก
var b
โ ์ด๋ฏธ b๊ฐ ์์ผ๋ฏ๋ก ์ค๋ณต ์ ์ธ์ ๋ฌด์
- ์คํ ๋จ๊ณ์์ b = bbb ํ ๋น โ ๊ธฐ์กด ํจ์๊ฐ ๋ฌธ์์ด๋ก ๋ฎ์ด์์์ง
์ฆ, function b()
๋ ์คํ ์ ์ ์ด๋ฏธ EnvironmentRecord์ ๋ฐ์ธ๋ฉ๋์ด ์๊ณ , ์ดํ b = 'bbb'
๊ฐ ์คํ๋๋ฉด, ํด๋น ์๋ณ์์ ๊ฐ๋ง ๋ณ๊ฒฝ๋๋ค.
Environment Record ์ ๋ฆฌ
์๋ณ์ function a
, var b
, var c
ํธ์ด์คํ
๊ฒฐ๊ณผ :
function a
: ํจ์ ์ ์ธ๋ฌธ ์ ์ฒด๊ฐ ํธ์ด์คํ ๋๋ค(๋์ด์ฌ๋ ค์ง๋ค).var b
,var c
: ๋ณ์ ์ ์ธ๋ง ๋์ด์ฌ๋ ค์ง๊ณ , ๊ฐ์undefined
๋ก ์ด๊ธฐํ๋๋ค.
์ด๋ ๊ฒ ๋์ด์ฌ๋ ค์ง ์๋ณ์ ์ ๋ณด๋ค์ด Environment Record
์ ์ ์ฅ๋๋ค.
์คํ ์ปจํ
์คํธ๊ฐ ์์ฑ๋ ๋ ํ์ฌ ์ค์ฝํ์ ์ด๋ค ์๋ณ์๊ฐ ์กด์ฌํ๋์ง๋ฅผ ๋จผ์ ์์งํ๋๋ฐ,
์ด ๊ณผ์ ๋๋ฌธ์, ๋ง์น ์ฝ๋์ ์ ์ธ๋ถ๋ง ์ฝ๋ ์๋จ์ผ๋ก ์ฌ๋ผ๊ฐ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ํ์์ด ๋ฐ์ํ๋ ๊ฒ์ด๋ค.
ํจ์ ์ ์ธ๋ฌธ๊ณผ ํจ์ ํํ์ โ
์๋ฐ์คํฌ๋ฆฝํธ์์ ํจ์๋ฅผ ์ ์ํ๋ ๋ฐฉ์์ ๋ํ์ ์ผ๋ก ํจ์ ์ ์ธ๋ฌธ ํจ์ ํํ์์ด ์๋ค. ์ด ๋์ ํธ์ด์คํ ๋ฐฉ์์์ ์ฐจ์ด๋ฅผ ๋ณด์ธ๋ค.
ํจ์ ์ ์ธ๋ฌธ(Function Declaration) โ
// ํจ์๋ช
a๊ฐ ๊ณง ๋ณ์๋ช
function a() {...}
a();
function a()
๋ ์คํ ์ปจํ ์คํธ ์์ฑ ์ EnvironmentRecord์ ์ ์ฒด ํจ์๊ฐ ๋ฑ๋ก๋๋ค.- ๋ฐ๋ผ์ ์ ์ธ ์ด์ ์๋ ์ ์์ ์ผ๋ก ํธ์ถํ ์ ์๋ค. ํจ์ ์ ์ธ์ ๋ณ์ ์ ์ธ๋ณด๋ค๋ ๋จผ์ ์์ง๋๋ค.
๐ก ํจ์ ์ ์ธ๋ฌธ
์ฝ๋ ์ ์์น์ ๊ด๊ณ์์ด, ๊ฐ์ฅ ๋จผ์ EnvironmentRecord์ ๋ฐ์ธ๋ฉ๋๋ ํน์ง์ด ์๋ค.
ํจ์ ํํ์(Function Expression) โ
// ์ต๋ช
ํจ์ ํํ์: ๋ณ์๋ช
b๊ฐ ๊ณง ํจ์๋ช
var b = function(){...}
b();
// ๊ธฐ๋ช
ํจ์ ํํ์: ๋ณ์๋ช
์ c, ํจ์๋ช
์ d
var c = function d(){...}
c()
d() // ReferenceError
var
๋ก ์ ์ธํ ํจ์ ํํ์์ ์ ์ธ๋ง ํธ์ด์คํ ๋๊ณ , ๊ฐ์ undefinedlet ๋๋ const
๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, TDZ(Temporal Dead Zone)์ ๊ฑธ๋ ค ์ ์ธ ์ ์ ์ ๊ทผํ๋ฉด ReferenceError๊ฐ ๋ฐ์ํ๋ค.function d()
์ฒ๋ผ ํจ์ ๋ด๋ถ์์ ์ด๋ฆ์ ๋ถ์ธ ๊ฒฝ์ฐ, ํด๋น ์ด๋ฆ์ ํจ์ ๋ด๋ถ์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋ฉฐ ์ธ๋ถ์์๋ ์ฌ์ฉ ๋ถ๊ฐํ๋ค.- ๊ธฐ๋ช ํํ์์ ๋๋ฒ๊น ์คํ ์ถ์ ๋๋ ๋ด๋ถ ์ฌ๊ท ํธ์ถ์ฉ ์ด๋ฆ ๋ถ์ฌ์ ์์ฃผ ์ฌ์ฉ๋๋ค.
์์ ๋น๊ต โ
์๋ณธ ์ฝ๋
// ์๋ณธ ์ฝ๋
console.log(sum(1, 2));
console.log(multiply(3, 4));
// ํจ์ ์ ์ธ๋ฌธ sum
function sum(a, b) {
return a + b;
}
// ํจ์ ํํ์ multiply
var multiply = function (a, b) {
return a * b;
};
ํธ์ด์คํ ์ดํ์ ๊ฐ๋ ์ ์ฝ๋ ์์
// ํจ์ ์ ์ธ๋ฌธ์ ์ ์ฒด ํจ์๊ฐ ๋์ด์ฌ๋ ค์ง๋ค.
// ๋น์ ์ ์์
var sum = function sum(a, b) {
return a + b;
};
// ์ค์ ๋ก๋ sum์ด๋ผ๋ ์ด๋ฆ์ด EnvironmentRecord์ ๋ฐ์ธ๋ฉ๋๊ณ ,
// ๊ทธ ๊ฐ์ผ๋ก ์ ์ฒด ํจ์ ๊ฐ์ฒด๊ฐ ๋ค์ด๊ฐ. sum: <function object>
// function sum(a, b) {
// return a + b;
// }
var multiply; // ๋ณ์๋ ์ ์ธ๋ถ๋ง ๋์ด์ฌ๋ฆฝ๋๋ค.
console.log(sum(1, 2));
console.log(multiply(3, 4)); // TypeError: multiply is not a function
// ๋ณ์์ ํ ๋น๋ถ๋ ์๋ ์๋ฆฌ์ ๋จ๊ฒจ๋๊ณ ์ค์ ํจ์ ํ ๋น์ ์ฌ๊ธฐ์ ์ด๋ค์ง
multiply = function (a, b) {
return a * b;
};
4-2. Outer Environment Reference โ
Outer Environment Reference
๋ ํ์ฌ ์คํ ์ปจํ
์คํธ์ ๋ ์์ปฌ ํ๊ฒฝ์ด ์ธ๋ถ ํ๊ฒฝ์ ์ฐธ์กฐํ๋ ๊ตฌ์กฐ์ด๋ค. ์ฆ, ํ์ฌ ์ปจํ
์คํธ์ ์กด์ฌํ์ง ์์ ์๋ณ์๋ฅผ ์ฐพ์ ๋, ์ด ์ฐธ์กฐ๋ฅผ ๋ฐ๋ผ ์ธ๋ถ ํ๊ฒฝ(Lexical Environment)์ ํ์ํ๊ฒ ๋๋ค.
๋ฐ๋ผ์, ์๋ ๋ณ์๋ ํจ์๋ Outer Environment Reference
๋ฅผ ํตํด ๋ฐ๊นฅ Lexical Environment
๋ฅผ ์ฐธ์กฐํ๋ค. ๋ง์ฝ ๊ฑฐ๊ธฐ์๋ ์ฐพ์ง ๋ชปํ๋ค๋ฉด, ๋ ๋ฐ๊นฅ์ ํ๊ฒฝ์ผ๋ก ๊ณ์ํด์ ํ์ํ๋ค.
์ด๋ฌํ ์ฐธ์กฐ ๊ตฌ์กฐ์ ์ํด ์ค์ฝํ ์ฒด์ธ(Scope Chain)
์ด ๋ง๋ค์ด์ง๋ค.
Scope Chain โ
inner
์ปจํ
์คํธ๋ ์์ ์ Environment Record
๋ฟ๋ง ์๋๋ผ,Outer Environment Reference
๋ฅผ ํตํด outer
์ ์ ์ญ ์ปจํ
์คํธ์ Lexical Environment
๊น์ง ์ฐธ์กฐํ ์ ์๋ค.
๐ ํ๋ฆ์ผ๋ก ์ดํดํ๋ ์ค์ฝํ ์ฒด์ธ
inner
์์ ์๋ณ์๋ฅผ ํ์ํ ๋๋ ๋ค์๊ณผ ๊ฐ์ ํ๋ฆ์ ๋ฐ๋ฅธ๋ค:
- ์์ ์ Environment Record์์ ์๋ณ์๋ฅผ ์ฐพ๋๋ค.
- ์์ผ๋ฉด Outer Environment Reference๋ฅผ ๋ฐ๋ผ
outer
์ Lexical Environment๋ก ์ด๋ํด ํ์ํ๋ค. - ๊ทธ๋๋ ์์ผ๋ฉด ๋ค์ Outer Environment Reference๋ฅผ ๋ฐ๋ผ
์ ์ญ
Lexical Environment๊น์ง ํ์ํ๋ค.
์ด์ฒ๋ผ ๊ฐ๊น์ด ์ค์ฝํ๋ถํฐ ๋ฐ๊นฅ ์ค์ฝํ๋ก ์ ์ง์ ์ผ๋ก ํ์ํ๋ ๊ตฌ์กฐ๋ฅผ ๐์ค์ฝํ ์ฒด์ธ์ด๋ผ๊ณ ํ๋ค.
๐ก Scope & Scope Chain ์์ฝ
Scope โ
- ๋ณ์์ ์ ํจ๋ฒ์๋ฅผ ์๋ฏธํ๋ฉฐ, ์คํ ์ปจํ ์คํธ์ ์ํด ๊ฒฐ์ ๋๋ค.
- ๋ณ์๋ ์์ ์ด ์ ์๋ ์คํ ์ปจํ ์คํธ ๋ด๋ถ์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
- ๋ด๋ถ(์์)์ค์ฝํ๋ ์ธ๋ถ(๋ถ๋ชจ) ์ค์ฝํ์ ์ ๊ทผํ ์ ์์ง๋ง, ์ธ๋ถ ์ค์ฝํ๋ ๋ด๋ถ ์ค์ฝํ์ ์ ๊ทผํ ์ ์๋ค.
โ ์ธ๋ถ์์๋ inner์ Lexical Environment๋ฅผ ์ฐธ์กฐํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
Scope Chain โ
- ํ์ฌ ์ค์ฝํ์์ ์๋ณ์๋ฅผ ์ฐพ์ง ๋ชปํ์ ๋, Outer Environment Reference๋ฅผ ๋ฐ๋ผ ๋ฐ๊นฅ ์ค์ฝํ๋ฅผ ์ฐจ๋ก๋ก ํ์ํ๋ ๊ตฌ์กฐ๋ค.
Shadowing โ
- ๊ฐ์ฅ ๊ฐ๊น์ด ์ค์ฝํ์ ๋์ผํ ์ด๋ฆ์ ์๋ณ์๊ฐ ์กด์ฌํ๋ฉด, ๊ทธ ์๋ณ์๊ฐ ์ฐ์ ์ฌ์ฉ๋๊ณ ๋ฐ๊นฅ ์๋ณ์๋ ๊ฐ๋ ค์ง๋ค.
- ์ด์ฒ๋ผ ๊ฐ๊น์ด ์ ์ธ์ด ์ฐ์ ํ๋ ํ์์ Shadowing์ด๋ผ๊ณ ํ๋ค.