๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive
23~24์ฅ์ ์ฝ์ผ๋ฉด์ ์ดํดํ ๋๋ก ์ ๋ฆฌํ๋ ํฌ์คํธ์ ๋๋ค.
// x, y๋ ํธ์ด์คํ
๋จ
// x๋ undefined
// y๋ <uninitialized>
var x = 1;
const y = 2;
function outer(a) {
var x = 3;
const y = 4;
function inner() {
// ์ค์ฝํ ์ฒด์ธ์ ์ํด์ x, y ๊ฐ์ ์ป์
console.log(x, y); // 3 4
}
return inner;
}
var func = outer();
// ํด๋ก์ ์ ์ํด์ outer() ๋ด๋ถ์ ์๋ณ์๋ฅผ ์ฌ์ฉํจ
func();
์คํ ์ปจํ ์คํธ: ์์ค ์ฝ๋๋ฅผ ์คํํ๋ ๋ฐ ํ์ํ ํ๊ฒฝ์ ์ ๊ณตํ๊ณ ์ฝ๋์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๊ด๋ฆฌํ๋ ์์ญ์ด๋ค.
์คํ ์ปจํ
์คํธ ์คํ: ์คํ ์ค์ธ ์คํ ์ปจํ
์คํธ๋ฅผ ๋ด๋ ์คํ์ผ๋ก ์ฝ๋์ ์คํ ์์๋ฅผ ๊ด๋ฆฌํ๋ค.
( ํญ์ ์ต์์์ ์กด์ฌํ๋ ์คํ ์ปจํ
์คํธ๊ฐ ํ์ฌ ์คํ๋๊ณ ์๋ ์คํ ์ปจํ
์คํธ์ด๋ค. )
ํ๊ฒฝ ๋ ์ฝ๋: ์ค์ฝํ์ ํฌํจ๋ ์๋ณ์๋ฅผ ๋ฑ๋กํ๊ณ ๋ฑ๋ก๋ ์๋ณ์์ ๋ฐ์ธ๋ฉ ๋ ๊ฐ์ ๊ด๋ฆฌํ๋ ์ ์ฅ์์ด๋ค.
์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ์ ๋ํ ์ฐธ์กฐ: ์์ ์ค์ฝํ๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
ํธ์ด์คํ ์ ์ค๋ช ํ ๋ ์ฃผ๋ก ๋ณ์์ ํจ์ ์ ์ธ๋ฌธ์ ๋์ด์ฌ๋ ค์ ์ต์์์์ ์คํ๋๋ ๊ฒ์ฒ๋ผ ๋์ํ๋ ๊ฒ์ด๋ผ๊ณ ๋งํฉ๋๋ค.
์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ "์คํ๋๋ ๊ฒ์ฒ๋ผ"์ ๋๋ค. ์ฆ, ์ด ๋ง์ ์ค์ ๋ก ๊ทธ๋ ๊ฒ ๋์ํ๋ ๊ฒ์ ์๋๋ผ๋ ์๋ฏธ์ ๋๋ค.
์ค์ ๋ก ์์ค ์ฝ๋๋ฅผ ์คํํ ๋๋ ํ๊ฐ/์คํ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค.
์์ค ์ฝ๋ ํ๊ฐ๊ณผ์ ์์ ๋ณ์/ํจ์ ์ ์ธ๋ฌธ์ ๋จผ์ ํ์ธํ๊ณ ํ๊ฒฝ ๋ ์ฝ๋์ ๋ฑ๋กํฉ๋๋ค.
์ด ๊ณผ์ ์์ ๋ณ์/ํจ์ ์ ์ธ๋ฌธ์ด ๋จผ์ ์คํํ๋ ๊ฒ์ ํธ์ด์คํ
์ด๋ผ๊ณ ํฉ๋๋ค.
ํจ์๋ ์๊ด์์ง๋ง, ๋ณ์ ์ ์ธ๋ฌธ์ ๋ฑ๋ก๋ง ๋๊ธฐ ๋๋ฌธ์ undefined
๋ uninitialized
์ ๊ฐ์ ๊ฐ๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ผ์ ๋ณ์ ์ ์ธ๋ฌธ ์ด์ ์ ๋ณ์๋ฅผ ์ฌ์ฉํด๋ ํธ์ด์คํ
์ ์ํด์ undefined
๋ฅผ ๊ฐ์ง ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋ ๊ฒ์ด๊ณ , uninitialized
์ผ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
uninitialized
๋ฅผ ๊ฐ์ ธ์ ์ค๋ฅ๋ฅผ ๋ฐ์ํ๋ค๊ณ ํด์ ํธ์ด์คํ
์ด ๋ฐ์ํ์ง ์๋ ๊ฒ์ ์๋๋๋ค.
uninitialized
์ด๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด๋ฏ๋ก ํธ์ด์คํ
์ด ๋์ํ๋ ๊ฒ์ผ๋ก ์ดํดํ ์ ์์ต๋๋ค.
var
์ผ ๊ฒฝ์ฐundefined
๋ก ์ ์ธ๊ณผ ๋์์ ์ด๊ธฐํ๋๊ณ ,
let
,const
์ผ ๊ฒฝ์ฐuninitialized
๋ก ์ ์ธ๊ณผ ๋์์ ์ด๊ธฐํ ๋ฉ๋๋ค.
์ ์ธ๊ณผ ๋์์ ์ด๊ธฐํํ๋ ์ด์ ๋ ์ฐ๋ ๊ธฐ๊ฐ์ด ๋ค์ด๊ฐ ์์ ํ๋ฅ ์ด ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ค์ฝํ ์ฒด์ธ์ ํ์ฌ ์ค์ฝํ์ ์กด์ฌํ๋ ์์ญ์ด ์์ ์ค์ฝํ์ ๊ฐ์ ๊ฐ์ง๋ ๊ฒ์ ๋งํฉ๋๋ค.
์๋ณ์๋ฅผ ๊ฒ์ํ ๋๋ ํ์ฌ ์ค์ฝํ์์ ์๋ณ์๋ฅผ ํ์ํ๊ณ ์กด์ฌํ์ง ์๋๋ค๋ฉด ์์ ์ค์ฝํ์์ ๋ค์ ๊ฒ์ํ๋ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค.
ํ์ฌ ์ค์ฝํ๋ฅผ ๋จผ์ ๊ฒ์ํ๋ฏ๋ก ์ค์ฝํ๋ง๋ค ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ์๋ณ์๋ฅผ ๊ฐ์ง๊ณ ์์ด๋ ํ์ฌ ์ค์ฝํ๋ฅผ ๋จผ์ ํ์ํด ๊ฐ๊น์ด ์ค์ฝํ์ ์๋ณ์์ ๊ฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋ฐ ์ค์ฝํ ์ฒด์ธ์ด ๋์ํ๋ ์๋ฆฌ๋ ์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ์ ๋ํ ์ฐธ์กฐ( Outer Lexical Environment Reference
) ๋๋ถ์
๋๋ค.
์คํ ์ปจํ
์คํธ์ ๋ ์์ปฌ ํ๊ฒฝ์์ ์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๋ฏ๋ก ์์ ์ค์ฝํ ์คํ ์ปจํ
์คํธ์ ๋ ์์ปฌ ํ๊ฒฝ์ ํ๊ฒฝ ๋ ์ฝ๋์ ์ ๊ทผํด์ ๋ณ์๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
์ ๊ฐ ์ดํดํ ๋๋ก ํด๋ก์ ๋ฅผ ์ ์ํ์๋ฉด ์คํ ์ปจํ ์คํธ ์คํ์์ ์ ๊ฑฐ๋ ์คํ ์ปจํ ์คํธ์ ์ํ๋ ์๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์์ ์ฝ๋์์ func()
๊ฐ ์คํ๋๋ ์์ ์ outer()
๋ ์ด๋ฏธ ์คํ ์ปจํ
์คํธ์์ ์ ๊ฑฐ๋ ์ํ์
๋๋ค.
ํ์ง๋ง outer()
์ ์ํ๋ ์๋ณ์์ธ x
์ y
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ด๋ฐ ์ํฉ์ ํด๋ก์ ๋ผ๊ณ ์ดํดํ๋๋ฐ ์ด๊ฒ์ ์ดํดํ๊ธฐ ์ํด์๋ ๋ช ๊ฐ์ง ์ ํ์ง์์ด ํ์ํฉ๋๋ค.
JavaScript
์ ํจ์๋ ์ผ๊ธ ๊ฐ์ฒด์ด๋ค. ( ํจ์์ ๋ฐํ ๊ฐ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ, ๋ณ์์ ํ ๋น ๊ฐ๋ฅ )null
์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ )[[Environment]]
)outer()
์ ๋ฐํ ๊ฐ์ ์ํด์ inner()
๊ฐ์ ์์ ์ค์ฝํ์ ๋ณ์์ธ func
์ ํ ๋นํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ outer()
๊ฐ ์คํ ์ปจํ
์คํธ ์คํ์์ ์ ๊ฑฐ๋์ด๋ func()
-> inner()์ [[Environment]]
-> outer()์ ๋ ์์ปฌ ํ๊ฒฝ
์ ์ํด์ outer()
์ ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋ฐ๋ผ์ func()
๊ฐ์ด ๋ณํ์ง ์๋ ํ outer()
๊ฐ ํ ๋น ํด์ ๋์ง ์์ต๋๋ค.
์ด๋ ๊ฒ func()
๋ฅผ ์ด์ฉํด์ outer()
์ ๋ณ์์ ์ ๊ทผํ๋ ๊ฒ์ ํด๋ก์ ๋ผ๊ณ ํฉ๋๋ค.