์คํ ์ปจํ ์คํธ
์คํ ์ปจํ ์คํธ
์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ ์ ์ ๋ฆฌํ๋ค ๋ณด๋ฉด ์ฌ์ฌ์น ์๊ฒ ์คํ์ปจํ ์คํธ๋ผ๋ ๋จ์ด๊ฐ ๋ณด์ ๋๋ค. ๊ทธ๋ ๊ธฐ์ ์ ๋ฆฌํด ๋ณด๊ฒ์ต๋๋ค.
์ ์์์ผ ํ๋๊ฐ?
“์คํ ์ปจํ ์คํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ ๊ทธ๋ ๊ฒ ๋์ํ๋ ์ง ์ฌ๋ฌ๋ถ๊ป ์ค๋ช ํด์ค๋๋ค.” - ์ ๋ก์ด ๋ธ๋ก๊ทธ
“์คํ ์ปจํ ์คํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋์์๋ฆฌ๋ฅผ ๋ด๊ณ ์๋ ํต์ฌ ๊ฐ๋ ์ด๋ค.” - ๋ชจ๋ ์๋ฐ ์คํฌ๋ฆฝํธ ๋ฅ๋ค์ด๋ธ
๋ฐฐ์์ผ ๊ฒ ์ฃ ?... ใ
๊ทผ๋ฐ ์ด๋ ต๋ค
์คํ์ปจํ ์คํธ๋ฅผ ์ ๋ฆฌ ํ๊ธฐ์ํด ์ฌ๋ฌ ๋ธ๋ก๊ทธ์ ์ฑ ์ ๋ณด๋ค๋ณด๋ฉด ๋ค๋ค ํ๋ ๊ฐ์ด ์ด๋ ต๋ค๊ณ ๋งํฉ๋๋ค.
ํ์ง๋ง ์ค์ํ ๊ฐ๋ ์ด๊ธฐ์ ๋๊น์ง ์ ์ ์ค ๋ถ์ก๊ณ ๋ฐ๋ผ ์ค์๊ธธ…
๋ด์ฉ์ด ์ซ๋ง๊ณ ์ฑ ์ ์๋ ๋ด์ฉ๋ค์ ์ถ๋ ค์ ๊ฐ์ ธ์ค๋ค๋ณด๋ ๋ด์ฉ์ด ๋์์์ด ์งํ ๋๋๋ฐ ํ๋ฒ ๋๊น์ง ์ฝ์ผ์๊ณ ํ๋ฒ ๋ ์ฝ๋ ๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค!.
์์์ ๊ฐ๋จํ ์ฉ์ด ์ ๋ฆฌ
Stack
์คํ์ “์ ์ ํ์ถ”์ ๋๋ค. ๋ง๊ทธ๋๋ก ๋จผ์ ๋ฃ์๊ฒ ๋์ค์ ๋์จ๋ค๋ ๋ป์ ๋๋ค.
ํต์ ํฌ๊ธฐ์ ๋ฑ๋ง๋ ์ ค๋ฆฌ๊ฐ ๋ค์ด์๋ ์ํต? ์ ๋ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค.
ํธ์ด์คํ
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ฐํ์ ์ ์ ์ค๋น๋ฅผ ํฉ๋๋ค.
์ฌ์ฉํ ๋ณ์๋ ํจ์์ ์ ์ธ๋ฌธ๋ค์ด ๋งจ~ ์๋ก ์ฌ๋ผ๊ฐ๋ ๊ฒ ์ฒ๋ผ ์์ ์ ํ๋๋ฐ, ์ดํดํ๊ณ ์์ผ์๋ฉด ์คํ ์ปจํ ์คํธ๋ฅผ ์ ๋ฆฌํ๋๋ฐ ๋์์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค!.
์คํ ์ปจํ ์คํธ๋?
์๋ฐ์คํฌ๋ฆฝํธ์ ์ฝ๋์ ์๋ค ๋ด์ฉ์ ์ดํดํ๊ธฐ ์ํ ์คํํ ์ฝ๋์ ์ ๊ณตํ ํ๊ฒฝ ์ ๋ณด๋ค์ ๋ชจ์๋์ ๊ฐ์ฒด์ ๋๋ค.
์๋์ ์ฝ๋๋ ์ ๋ก์ด ๋์ ๋ธ๋ก๊ทธ์์ ๊ฐ์ ธ์จ๊ฑด๋ฐ ์คํ ์ปจํ ์คํธ์ ๋ํด ์ดํดํ๊ธฐ ์ข์ ๊ฒ ๊ฐ์ ๊ฐ์ ธ์๋ดค์ต๋๋ค.
์ปจํ ์คํธ ๊ฐ์ฒด์๋ {’๋ณ์๊ฐ์ฒด’, ‘scopeChain’, ‘this ๋ฐ์ธ๋ฉ’}์ด ์์ต๋๋ค.
์ด๋ค์ค ๋ณ์๊ฐ์ฒด์ scopeChain์ ๋ํด์๋ง ์ค๋ช ์ ํด๋ณด๊ฒ ์ต๋๋ค.
'์ ์ญ ์ปจํ
์คํธ': {
๋ณ์๊ฐ์ฒด: {
arguments: null,
variable: ['name', 'wow', 'say'],
},
scopeChain: ['์ ์ญ ๋ณ์๊ฐ์ฒด'],
this: window,
}
์์ค์ฝ๋ ํ๊ฐ์ ์คํ
๋ชจ๋ ์์ค์ฝ๋๋ ์คํ์(๋ฐํ์) ์์ ํ๊ฐ ๊ณผ์ ์ ๊ฑฐ์น๋ฉฐ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํ ์ค๋น๋ฅผ ํฉ๋๋ค.
์ฆ, JSEngine์ ํ๊ฐ์ ์คํ์ ๋๋์ด ์ฒ๋ฆฌํฉ๋๋ค. (ํธ์ด์คํ ์ด ์๊ฐ ๋์์ฃ ? ์ข์ต๋๋ค).
ํ๊ณผ ๊ณผ์ ์์๋ ์คํ ์ปจํ ์คํธ๋ฅผ ์์ฑ.
๋ณ์ ํจ์๋ฑ์ ์ ์ธ๋ฌธ๋ง ๋จผ์ ์คํํ์ฌ ์์ฑ๋ ๋ณ์๋ ํจ์ ์๋ณ์๋ฅผ ํค๋ก ์คํ ์ปจํ ์คํธ๊ฐ ๊ด๋ฆฌํ๋ ๋ ์์ปฌ ์ค์ฝํ์ ์ ์ฅํฉ๋๋ค.
๋ญ์๋ฆฌ๋ ํ๋ฉด
var x;
x = 10;
๋ฐํ์ ์ var x; ์์ค์ฝ๋๋ ๋ฐํ์ ์ ์ ์คํ ์ปจํ ์คํธ๊ฐ ๊ด๋ฆฌํ๋ ์ค์ฝํ์ ๋ฑ๋ก์ด๋๊ณ undefined๋ก ์ด๊ธฐํ ๋ฉ๋๋ค.
ํ๊ฐ ๊ณผ์ ์ด ๋๋๋ฉด ์คํ๊ณผ์ ์ด ์์๋๋๋ฐ, var x;๋ ์ด๋ฏธ ํ๊ฐ์์ ์คํ์ด ์๋ฃ ๋์๊ธฐ ๋๋ฌธ์ x=10;์ด ์คํ ๋ฉ๋๋ค. ์ด๋ x์ ๊ฐ์ด ์๋์ง ํ์ธํ๋๋ฐ ์ด๋ ์ค์ฝํ์ x๊ฐ ์๋์ง ํ์ธํ๊ณ ๋ฑ๋ก๋ ๋ณ์์์ด ํ์ธ๋๋ฉด, ๊ฐ์ ํ ๋นํฉ๋๋ค.
์ฌ๊ธฐ๊น์ง ์ ๋ฆฌํ๋ฒ ํ๊ณ ๊ฐ๊ฒ ์ต๋๋ค.
- ์คํ ์ปจํ ์คํธ๋ ์ฝ๋์ ์คํ ์์ ์ฆ, ์ฝ๋์ ๋ฌธ๋งฅ์ด๋ค.
- JS์ฝ๋๋ ์คํ์ ์์ ํ๊ฐ ํ ์คํํ๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ๋๋ค.
- ์์ ์์ ๋ก x๊ฐ ํ๊ฐ ๋ ๋๋ undefined๋ก ์คํ๋ ๋๋ ์คํ ์ปจํ ์คํธ ์์ ๋ ์์ปฌ ์ค์ฝํ์ ๋ฑ๋ก๋์ด ์๋์ง ํ์ธ ํ ๊ฐ์ ํ ๋นํ๋ค.
์คํ ์ปจํ ์คํธ ์ญํ
์๋ ๊ทธ๋์ ์คํ ์ปจํ ์คํธ๊ฐ ๋ญํ๋ ๊ฑด๋ฐ?
const x = 1;
const y = 2;
function foo(a) {
const x = 10;
const y = 20;
console.log(a + x + y);
}
foo(100);
console.log(x + y);
์ด๋ป๊ฒ ์คํ ๋ ๊น์ฌ?
์์ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ fooํจ์๊ฐ ์ข ๋ฃ๋๋ฉด. ํจ์ ๋ฐ์ผ๋ก ๋์์ผ ํฉ๋๋ค.
- ํจ์ํธ์ถ ์ด์ ๋จ๊ณ๋ก ๋๋์๊ฐ๊ธฐ ์ํด ํ์ฌ ์คํ์ค์ธ ์ฝ๋์ ์ด์ ์ ์คํํ๋ ์ฝ๋๋ฅผ ๊ตฌ๋ถํ์ฌ ๊ด๋ฆฌ.
- ์ด์ฒ๋ผ ์คํ๋๋ ค๋ฉด ์ค์ฝํ, ์๋ณ์, ์ฝ๋ ์คํ์์ ๋ฑ์ ์ ๋ณด๊ฐ ํ์ํฉ๋๋ค.
์ด ๋ชจ~๋ ๊ฒ์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ฐ๋ก ์คํ ์ปจํ ์คํธ ์ ๋๋ค.
์คํ ์ปจํ ์คํธ๋ ์์ค์ฝ๋๋ฅผ ์คํํ๋๋ฐ ํ์ํ ํ๊ฒฝ์ ์ ๊ณตํ๊ณ ์ฝ๋์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ค์ ๋ก ๊ด๋ฆฌํ๋ ์์ญ์ ๋๋ค.
์ฝ๊ฒ ์ค๋ช ์ ๋๋ฆฌ๋ฉด
๋ฐฉ๊ธ ์์ ์ฝ๋๋ฅผ ์ฝ๊ณ ๊ฐ๊ฐ์ ์ผ๋ก foo์์ console.log(a + x + y); ์ฝ๋ ์์ ๋ณ์๋ค์ด ์ ์ญ ๋ณ์๋ค์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ fooํจ์ ๋ด๋ถ์ ๋ณ์๋ค์ ์ฌ์ฉํ๋ค๊ณ ์๊ฐํ์ค ๊ฒ๋๋ค.
๋ํ ํจ์ ๋ฐ์ผ๋ก ์ด๋ํ๊ธฐ ์ํด์ ํจ์์์ ์์ ์ ํธ์ถํ ๊ณต๊ฐ์ ๋ํ ์ ๋ณด๊ฐ ํ์ํ๊ฒ ์ฃ ?
์คํ ์ปจํ ์คํธ๋ ์ธ๊ฐ์ ๊ฐ๊ฐ์ ์ผ๋ก ๊ฐ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์ฝ๋์ง์ ๋ํ ๋ด์ฉ์ ๋๋ค.
์ซ ์ถ์์ ์ด์ฃ ??
์คํ ์ปจํ ์คํธ ์คํ
const x = 1;
function foo() {
const y = 2;
function bar() {
const z = 3;
console.log(x + y + z);
}
bar();
}
foo()
JSEngine์ ๋จผ์ ์ ์ญ์ฝ๋๋ฅผ ํ๊ฐํ๋ค๊ณ ์์์ ์ค๋ช ํ์ฃ ?? → ์คํ ํ ์ ์ญ ์ปจํ ์คํธ๋ผ๋ ๋ฌธ์๋ฅผ ๋ฑ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ํจ์๊ฐ ํธ์ถ๋๋ฉด ํจ์์ฝ๋๋ฅผ ํ๊ฐ ํ์ฌ ํจ์ ์คํ ์ปจํ ์คํธ๋ฅผ ์์ฑํฉ๋๋ค.
์ด๋ ์์ฑ๋ ์คํ ์ปจํ ์คํธ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ํตํด ๊ด๋ฆฌ๋ฉ๋๋ค.
- ์ด๋ฅผ ์คํ ์ปจํ ์คํธ ์คํ์ด๋ผ ๋ถ๋ฆ ๋๋ค.
์๊น ์คํ์ปจํ ์คํธ์ ์ญํ์์ ๋ดค๋ ์ฝ๋ ์ถ์ํ ์คํ ์์๋ฅผ ์์ ์์ ๋ก ์ผ๋ฐํ ์์ผ ๋ณด๊ฒ ์ต๋๋ค.
์ ์ญ ์ฝ๋ ํ๊ฐ → ์ ์ญ ์ฝ๋ ์คํ → ํจ์ ์ฝ๋ ํ๊ฐ → ํจ์ ์ฝ๋ ์คํ.
- ์ ์ญ ์ฝ๋์ ํ๊ฐ์ ์คํ
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋จผ์ ์ ์ญ ์ฝ๋๋ฅผ ํ๊ฐํด์ ์ ์ญ ์ปจํ ์คํธ๋ฅผ ์์ฑํ๊ณ ์คํ ์ปจํ ์คํธ ์คํ์ ํธ์ํฉ๋๋ค. ์ด๋ ์ ์ญ ๋ณ์ x์ ์ ์ญํจ์ foo๋ ์ ์ญ ์คํ ์ปจํ ์คํธ์ ๋ฑ๋ก ๋ฉ๋๋ค.. ์ดํ ์ ์ญ ์ฝ๋๊ฐ ์คํ ๋๊ธฐ ์์ํ์ฌ ์ ์ญ ๋ณ์x์ ๊ฐ์ด ํ ๋น๋๊ณ ์ ์ญ๋ณ์ foo๊ฐ ํธ์ถ!.
- foo ํจ์ ์ฝ๋์ ํ๊ฐ์ ์คํJSEngine์ fooํจ์ ๋ด๋ถ์ ์ฝ๋๋ฅผ ํ๊ฐํ์ฌ fooํจ์ ์คํ ์ปจํ ์คํธ๋ฅผ ์์ฑ ํธ์ํฉ๋๋ค. ์ด๋ ์ง์ญ๋ณ์ y์ ๊ฐ์ด ํญ๋น๋๊ณ ์ค์ฒฉ ํจ์ bar๊ฐ ํธ์ถ ๋ฉ๋๋ค.
- ์ ์ญํจ์ foo๊ฐ ํธ์ถ๋๋ฉด ์ ์ญ์ฝ๋์ ์คํ์ ์ผ์ ์ค๋จ๋๊ณ ์ฝ๋์ ์ ์ด๊ถ์ด fooํจ์ ๋ด๋ถ๋ก ์ด๋ํฉ๋๋ค.
- bar ํจ์ ์ฝ๋์ ํ๊ฐ์ ์คํ
- ์ค์ฒฉํจ์ bar๊ฐ ํธ์ถ๋๋ฉด fooํจ์ ์ฝ๋์ ์คํ์ ์ผ์ ์ค๋จ๋๊ณ ์ฝ๋์ ์ ์ด๊ถ์ด barํจ์ ๋ด๋ถ๋ก ์ด๋ํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ bar ํจ์ ๋ด๋ถ์ ์ฝ๋๋ฅผ ํ๊ฐํ์ฌ barํจ์์ ์คํ ์ปจํ ์คํธ๋ฅผ ๋ง๋ค๊ณ ์คํ์ปจํ ์คํธ ์คํ์ ํธ์ํฉ๋๋ค. ์ด๋ ์ง์ญ๋ณ์ z์ ๊ฐ์ด ํ ๋น ๋๊ณ ๋ด๋ถ ์ฝ๋๋ฅผ ์คํํ. ์ข ๋ฃ๋ฉ๋๋ค.
- fooํจ์๋ก ๋ณต๊ท
- barํจ์๊ฐ ์ข ๋ฃ ๋๋ฉด ์ ์ด๊ถ์ ๋ค์ foo ํจ์๋ก ์ด๋ํ๋ค. ์ด๋ ๋ ์ด์ ์งํํ ์ฝ๋๊ฐ ์์์ผ๋ก ์ข ๋ฃ. bar๋ ์คํ์์ ํ๋ฉ๋๋ค.
- ์ ์ญ ์ฝ๋๋ก ๋ณต๊ท
- fooํจ์๊ฐ ์ข ๋ฃ๋๋ฉด ์ฝ๋์ ์ ์ด๊ถ์ ๋ค์ fooํจ์๋ก ์ด๋ํฉ๋๋ค. ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ fooํจ์ ์คํ ์ปจํ ์คํธ๋ฅผ ์คํ์์ ํํฉ๋๋ค.
์ด์ฒ๋ผ ์คํ ์ปจํ ์คํธ ์คํ์ ์ฝ๋์ ์คํ ์์๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
๋ ์์ปฌํ๊ฒฝ
์์์๋ ์ฌํ๊ป ์ ์ฒด์ ์ธ ์ฝ๋๊ฐ ์ด๋ป๊ฒ ๋์ํ๋ ์ง์ ๋ํ ์ค๋ช ์ด์์ต๋๋ค. ๊ทธ๋ผ ๊ณต๊ฐ์์ ๋ณ์๋ ์ด๋ป๊ฒ ๊ด๋ฆฌ ๋๊ณ ๋์๋ ๊น์ฌ?
- ๋ ์์ปฌ ํ๊ฒฝ์ ์๋ณ์์ ์๋ณ์์ ๋ฐ์ธ๋ฉ๋ ๊ฐ.
- ๊ทธ๋ฆฌ๊ณ ์์ ์ค์ฝํ์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ธฐ๋กํ๋ ์๋ฃ๊ตฌ์กฐ๋ก ์คํ ์ปจํ ์คํธ๋ฅผ ๊ตฌ์ฑํ๋ ์ปดํฌ๋ํธ ์ ๋๋ค.
- ์คํ ์ปจํ ์คํธ ์คํ์ด ์ฝ๋์ ์คํ ์์๋ฅผ ๊ด๋ฆฌํ๋ค๋ฉด ๋ ์์ปฌ ํ๊ฒฝ์ ์ค์ฝํ์ ์๋ณ์๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
์ ๋ฆฌ: ๋ ์์ปฌํ๊ฒฝ์ ์๋ณ์์ ๊ฐ ์์์ ์๋ ๋ด๊ฐ ์ฐธ์กฐํ ์ ์๋ block์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์์ต๋๋ค.
const x = 1;
function foo() {
const y = 2;
console.log(x + y);
}
foo ํจ์์ ์ง์ญ๋ณ์ y๊ฐ ์๋ค. foo๋ ์ด๋ป๊ฒ x์ ๊ฐ์ ์ฐพ์๊น?? ์ ๋ํ ๋ต์ด์.
๋ ์์ปฌ ํ๊ฒฝ์ ์ญํ ์ ๋๋ค.
- ์ด ๋ถ๋ถ์ ์์ผ๋ก ๋ฐฐ์ธ ํด๋ก์ ์์ ๊ต์ฅํ ๋ฐ๋ฐํ์ด ๋ฉ๋๋ค. ๊ทธ๋ ๊ธฐ์ ์์งํด๋๊ณ ๊ฐ์๋ฉด ์ข์ต๋๋ค.
let age = 30;
function showAge() {
console.log(age);
let age = 20;
}
showAge();
์์ ์ฝ๋๊ฐ ์ด๋ป๊ฒ ๋์ํ ์ง ์ ์ญ ์ฝ๋ ํ๊ฐ → ์ ์ญ ์ฝ๋ ์คํ → ํจ์ ์ฝ๋ ํ๊ฐ → ํจ์ ์ฝ๋ ์คํ ์์๋๋ก ๋จธ๋ฆฟ์์ผ๋ก ํน์ ๊ณต์ฑ ์ ์ ์ด๊ฐ๋ฉฐ ๋ง๋ค์ด ๋ณด์ธ์!. ๋ ๋ธ๋ญ ์์ ์ํ๋ ๋ณ์๊ฐ ์์ผ๋ฉด ์ด๋ป๊ฒ ๋์ํ๋์ง๋ ์์ ์ด๋ฏธ์ง๋ฅผ ๋ณด๋ฉฐ ๊ณต๋ถํด ๋ณด์๋ฉด ์ ๋ฆฌ๊ฐ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
https://www.zerocho.com/category/JavaScript/post/5741d96d094da4986bc950a0
https://www.zerocho.com/category/JavaScript/post/5741d96d094da4986bc950a0
www.zerocho.com