
์ด์ ํฌ์คํ ์์ JS๋ ๋ฐํ์์ ์์ง์ด ์คํ, ํ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ๊ฒ์ ๋ฐฐ์ ๋ค. ์คํ๊ณผ ํ์์ ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ค ์ผ์ด ๋ฒ์ด์ง๊น?
์์ง์ด ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํ์ํจ๋ค๋ ๊ฒ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ด ์๋ ํจ์๋ฅผ ์คํ์ํจ๋ค๋ ๊ฒ์ด๋ค. ํ์ผ์ main ํจ์์ธ ๊ฒฉ.
์ฆ, ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ ๊ตฌ๋ ๋ฐฉ์์ ํจ์ ๊ตฌ๋ ๋ฐฉ์๊ณผ ๋์ผํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ํจ์ ๊ตฌ๋ ๋ฐฉ์์ ๋ชจ๋ฅธ๋ค๋ฉด ์ด์ ํฌ์คํ
์คํ ์ปจํ
์คํธ ์ ๋จผ์ ์ ๋
ํ๊ธธ ๋ฐ๋๋ค.
๊ฐ๋จํ๊ฒ ๋งํ์๋ฉด stack = ์คํ ์ปจํ
์คํธ , heap = ๋ ์์ปฌ ํ๊ฒฝ ์ธ ์
์ด๋ค.
์์ง ๋ด ํจ์๋ stack์ด๋ผ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์ ์ผ์ข
์ ํ๋ก์ธ์ค๋ก์ ,ํจ์๊ฐ ์คํ๋๋ ๊ณต๊ฐ์ ์คํ ์ปจํ
์คํธ๋ผ ํ๋ค.
๊ธด ๋ง ํ์์์ด ์ฝ๋๋ฅผ ๋ณด์.
var name = 'zero';
function log() {
console.log(name);
}
function wrapper() {
name = 'nero';
log();
}
wrapper(); // name ์ถ๋ ฅ๊ฐ ๋ง์ถฐ๋ณด์ธ์~!
js ํ์ผ์ด ๋ฐํ์ ๋๊ธฐ ์ ๋จผ์ ๋ณ์,ํจ์ ๋ฑ์ด ์ ์ธ, ์ด๊ธฐํ์ํจ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ํน์ฑ์ ํค์๋๋ก ์ ์ธํ ๋ชจ๋ ์๋ณ์๋ ํธ์ด์คํ ๋๋ฏ๋ก ์ ์ธ ์์น๋ ๋ฌด๊ดํ๋ค. ์ด ๊ณผ์ ์์ var๋ก ์ ์ธ๋ ๋ณ์๋ค์ ์ ์ธ๊ณผ ์ด๊ธฐํ๊ฐ ํจ๊ป ์ฒ๋ฆฌ๋๋ฉฐ, ์ค์ฝํ๊ฐ ์ ์ญ์ด๊ฑฐ๋ ํจ์ ๋จ์๋ก ์ ํ๋๋ค.
์ ์ธ ๋ฐ ์ด๊ธฐํ ๋จ๊ณ ์ดํ์ ํจ์ ์คํ์ ์ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํ๋ณดํ๊ณ ์คํ์ํจ๋ค. ์ด ๋, ์คํ์๋ ์คํ ์ปจํ ์คํธ๊ฐ ์์ด๊ฒ ๋๋ฉฐ, ๊ฐ ์ปจํ ์คํธ๋ ํจ์ ํธ์ถ์ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ํฌํจํ๋ค.
ํจ์๊ฐ ์คํ(ํธ์ถ)๋จ์ ๋ฐ๋ผ EC๊ฐ ์ฝ์คํ์ ์์ด๊ณ EC ๋ด๋ถ์ ๋ณ์ ๋ฐ ํจ์๋ Lexical(Static) Scope ๋ ์์ปฌ ์ค์ฝํ๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ ์ธ ๋ฐ ์คํ๋๋ค. ํ์ํ ๊ฒฝ์ฐ(ํด๋น EC๋ด์ ๋ณ์์ ๋ํ ์ ๋ณด๊ฐ ์์ด์ ๋ถ๋ชจ๋ก ๊ฑฐ์ฌ๋ฌ์ฌ๋ผ๊ฐ์ผํจ) scope chaining์ ํ๋ค.

์์ ๊ฐ์ ๊ณผ์ ์ผ๋ก "nero"๊ฐ ์ถ๋ ฅ๋๋ค.
let name = 'zero';
function log() {
console.log(name);
}
function wrapper() {
name = 'nero';
log();
}
wrapper(); // name ์ถ๋ ฅ๊ฐ ๋ง์ถฐ๋ณด์ธ์~!

๊ณผ์ ์ ์ข ๋ค๋ฅด์ง๋ง ์ญ์ "nero"๊ฐ ์ถ๋ ฅ๋๋ค.
var๊ณผ ๋ฌ๋ฆฌ let ์ ์ธ์ ์ฌ์ฉ์ ์ ์ธ๊ณผ ์ด๊ธฐํ๋ ๋ณ๊ฐ๋ก ์ผ์ด๋๋ค. ์ฒ์ ๋ฃ๋๋ค๋ฉด ์ด์ ํฌ์คํ ํธ์ด์คํ ์ ์ ๋ ํ๋ผ.
var name = 'zero';
function log() {
console.log(name);
}
function wrapper() {
var name = 'nero';
log();
}
wrapper(); // name ์ถ๋ ฅ๊ฐ ๋ง์ถฐ๋ณด์ธ์~!

JS ์์ง์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ ๋ ์คํ ์ปจํ ์คํธ(EC)๋ฅผ ์คํ์ ์์์ ๊ด๋ฆฌํ๋ค. ์ด ๊ณผ์ ์์ ๋ณ์์ ํจ์๋ ํธ์ด์คํ ๋์ด ์ ์ธ๊ณผ ์ด๊ธฐํ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ค. ํจ์ ์คํ ์, ์ค์ฝํ ์ฒด์ด๋์ ํตํด ํ์ํ ๋ณ์๋ฅผ ์ฐพ์๊ฐ๋ฉฐ, var์ let/const๋ ์ค์ฝํ ๊ท์น์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋์ํ๋ค.
์ฐธ๊ณ
โ๏ธ ํจ์์ ๋ฒ์(scope)