JavaScript | ์ค์ฝํ์ ํธ์ด์คํ
๐จ๐ป ์ค์ฝํ์ ํธ์ด์คํ
์ค๋์ ์๋ฐ์คํฌ๋ฆฝํธ ์์์ ์ค์ฝํ๋ผ๋ ์ฉ์ด์ ํธ์ด์คํ ์ด๋ผ๋ ์ฉ์ด์ ๋ํด ๊ณต๋ถํ๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Scope(์ค์ฝํ) ๋จ์ด ๊ทธ์์ฒด๋ฅผ ์ง์ญํ๋ฉด ๋ฒ์๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ทธ๋ผ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋งํ๋ Scope๋ ์ด๋ค ๋ฒ์๋ฅผ ์๋ฏธํ๋ ๊ฒ์ผ๊น์?
ํ๋ก๊ทธ๋๋ฐ์์๋ ๋ณ์๋ ํจ์์ ์ด๋ฆ์ ๋ถ์ฌํ์ฌ ์๋ฏธ๋ฅผ ๊ฐ๋๋ก ํ๊ณ ์์ต๋๋ค. ๋ง์ฝ ์ด๋ฆ์ด ์๋ค๋ฉด ๋ณ์๋ ํจ์๋ ๊ทธ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ์ง๋์ง ์๊ฒ๋๊ฒ ์ฃ . ๊ทธ๋์ ํ๋ก๊ทธ๋จ์ "์ด๋ฆ: ๊ฐ"์ ๋์ํ๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํฉ๋๋ค. ์ด ๋์ํ์ ์ด๋ฆ์ ๊ฐ์ง๊ณ ์ฝ๋๋ฅผ ๋ณด๋ค ์ฝ๊ฒ ์ดํดํ๊ณ , ๋ ์ด๋ฆ์ ํตํด ๊ฐ์ ์ ์ฅํ๊ณ , ๋ค์ ๊ฐ์ ธ์ ์์ ํฉ๋๋ค.
์ด๊ธฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ๋์ํ๋ฅผ ํ๋ก๊ทธ๋จ ์ ์ฒด์์ ํ๋๋ก ๊ด๋ฆฌํ์๋๋ฐ, ์ฌ๊ธฐ์์ ์ค๋ณต๋ ์ด๋ฆ๋ค ๊ฐ์ ์ด๋ฆ ์ถฉ๋์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
(์ ํต์ ์ธ ๋ฐฉ์์ธ var ๋ณ์ํ ํ์ ์ ์ด์ฉํ์ฌ ์ ์ธํ๋ค๋ฉด, ๋ฌธ๋ฒ์ ์ผ๋ก ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๊ณ ๋ ๋ฒ์งธ ๋์ค๋ ๋ณ์๊ฐ ์ฒซ ๋ฒ์งธ ๋ณ์๋ฅผ ๋ฎ์ด์ฐ์ฌ์ง๊ฒ ๋ฉ๋๋ค. ์ฆ ์ค๋ณต๋ ๋ณ์๋ค๊ฐ์ ์ถฉ๋์ด ์ผ์ด๋ ์ํฉ์ ๋๋ค.)
// ํธ์ด์คํ
๋ฌธ์ ๋ฐ์!
var test = "this is test";
var test = "I am test too!";
(์๋์ ์์ค์ฝ๋๋ ์ด๋ฌํ ์ค๋ณต๋ ์ด๋ฆ์ผ๋ก์ธํ ์ถฉ๋์ ํด๊ฒฐํ ๋ธ๋ก๋ ๋ฒจ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ ๊ฐ์ ์ํฉ์ด ๋ฐ์ํ๋ฉด ๋ฌธ๋ฒ์ ์ผ๋ก ์ค๋ฅ๋ฅผ ๋ฐ์ํฉ๋๋ค. )
// ์๋ชป๋ ์์ค์ฝ๋
let test = "this is test";
let test = "I am test too!";
๊ทธ๋์ ์ถฉ๋์ ํผํ๊ธฐ ์ํด์ฌ ๊ฐ ์ธ์ด๋ง๋ค "์ค์ฝํ"๋ผ๋ ๊ท์น์ ๋ง๋ค์ด ์ ์๋ฅผ ํ์๊ณ ์ฌ๊ธฐ์ ์๋ฐ์คํฌ๋ฆฝํธ(ES6)๋ ํจ์๋ ๋ฒจ๊ณผ ๋ธ๋ก๋ ๋ฒจ ์ ๋ ์์ปฌ ์ค์ฝํ ๊ท์น์ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค.
[์ค์ฝํ ๋ ๋ฒจ]
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ ํต์ ์ผ๋ก ํจ์ ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ์ง์ํด์๊ณ , ์ผ๋ง ์ ๊น์ง๋ง ํด๋ ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๋ ์ง์ํ์ง ์์์ต๋๋ค. ๋ํ์ ์ผ๋ก ํจ์ ๋ ๋ฒจ ์ค์ฝํ์ธ var๋ง ์ฌ์ฉํด ์์์ฃ . ํ์ง๋ง ๊ฐ์ฅ ์ต์ ๋ช ์ธ์ธ ES6(ECMAScript 6)๋ถํฐ ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ์ง์ํ๊ธฐ ์์ํ๊ณ ์ฌ๊ธฐ์ ๋์จ๊ฒ์ด let ๊ณผ const ์ ๋๋ค.
[ํจ์ ๋ ๋ฒจ ์ค์ฝํ & ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ]
์๋ฐ์คํฌ๋ฆฝํธ์์ varํค์๋๋ก ์ ์ธ๋ ๋ณ์๋, ํจ์ ์ ์ธ์์ผ๋ก ๋ง๋ค์ด์ง ํจ์๋ ํจ์ ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ๊ฐ์ต๋๋ค. ์ฆ, ํจ์ ๋ด๋ถ ์ ์ฒด์์ ์ ํจํ ์๋ณ์๊ฐ ๋๋ค๋ ์ด์ผ๊ธฐ์ฃ .
ํจ์ ๋ด๋ถ ์ ์ฒด์์ ์ ํจํ๋ค๋ ์๋ฏธ๋ ๋ฐ๋๊ฐ๋ ์ธ ๋ธ๋ก๊ฐ๋ ๊ณผ ๋น๊ตํ์ฌ ์ดํดํ๋ฉด ์ฝ์ต๋๋ค.
๋ธ๋ก๋ ๋ฒจ ์ค์ฝํ๋ค์ ๋ธ๋ก์์์๋ง ์ ํจํ๋ฐ, ์ด๋ฅผ ์ฝ๊ฒ ์ค๋ช ํ๊ฒ์ด ์ง์ญ๋ณ์ ์ ๋๋ค. ์ง์ญ๋ณ์๋ ํน์ ๋ธ๋ก์์์๋ง ์ฌ์ฉํ ์ ์๋ ๋ณ์์ธ๋ฐ์, ํด๋น ์ง์ญ(๋ธ๋ก)์ ๋ฒ์ด๋๋ฉด ์๋ฉธํ์ฌ ์์ํ ์ ์๋๊ฒ์ด ํน์ง์ ๋๋ค. ํ์ง๋ง ํจ์๋ ๋ฒจ ์ค์ฝํ๋ฅผ ๊ฐ์ง๋ ํจ์๋ค์ ํน์ ํจ์๋ด์์ ์ ์ธ์ด ๋์๋ค๋ฉด ๊ทธ ์ฅ์๊ฐ if๋ฌธ ์์ด๋ While๋ฌธ ์์ด๋๊ฐ์ ๊ทธ ์ง์ญ(๋ธ๋ก)์ ๋ฒ์ด๋๋ ํด๋น ๋ณ์๋ฅผ ์ฌ ์ฌ์ฉํ๋๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.
[๋ ์์ปฌ ์ค์ฝํ]
๊ทธ๋ ๋ค๋ฉด ๋ ์์ปฌ ์ค์ฝํ๋ ๋ฌด์์ธ๊ฐ?
๋ ์์ปฌ ์ค์ฝํ(Lexical scope)๋ ๋ณดํต ๋์ ์ค์ฝํ(Dynamic scope)์ ๋ง์ด ๋น๊ตํฉ๋๋ค.
๋์ ์ค์ฝํ๋ ํ๋ก๊ทธ๋จ์ ๋ฐํ์ ๋์ค์ ์คํ ์ปจํ ์คํธ๋ ํธ์ถ ์ปจํ ์คํธ์ ์ํด ๊ฒฐ์ ๋๊ณ ,
๋ ์์ปฌ ์ค์ฝํ์์๋ ์์ค์ฝ๋๊ฐ ์์ฑ๋ ๊ทธ ๋ฌธ๋งฅ์์ ๊ฒฐ์ ๋๋ค. ํ๋ ํ๋ก๊ทธ๋๋ฐ์์ ๋๋ถ๋ถ์ ์ธ์ด๋ค์ ๋ ์์ปฌ ์ค์ฝํ ๊ท์น์ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค.
[ํธ์ด์คํ ์ด๋]
ํธ์ด์คํ (Hoisting)์ ๋ฒ์ญํ๋ฉด ๋ค์ด์ฌ๋ ค ๋๋ฅด๊ธฐ, ๋์ด ์ฌ๋ฆฌ๊ธฐ๋ก ํด์๋ฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋งํ๋ ํธ์ด์คํ ๋ ๋น์ทํ ์๋ฏธ๋ก ์ฌ์ฉ๋๊ณ ์๋๋ฐ์ ์๋์ ๋ด์ฉ์ํตํด ์ด๊ฒ ๋ฌด์จ ์ด์ผ๊ธด์ง ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ํจ์๋ ์คํ๋๊ธฐ ์ ์ ํจ์ ์์ ํ์ํ ๋ณ์๊ฐ๋ค์ ๋ชจ๋ ๋ชจ์์ ์ ํจ ๋ฒ์์ ์ต์๋จ์ ์ ์ธํฉ๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ ํ์(Parser)๊ฐ ํจ์ ์คํ ์ ํด๋น ํจ์๋ฅผ ํ ๋ฒ ํ์ต๋๋ค.
- ํจ์ ์์ ์กด์ฌํ๋ ๋ณ์/ํจ์ ์ ์ธ์ ๋ํ ์ ๋ณด๋ฅผ ๊ธฐ์ตํ๊ณ ์๋ค๊ฐ ์ํ์ํต๋๋ค.
- ์ ํจ๋ฒ์: ํจ์ ๋ธ๋ก "{}" ์์์ ์ ํจ
์ฆ, ํจ์ ๋ด์์ ์๋์ชฝ์ ์กด์ฌํ๋ ๋ด์ฉ ์ค ํ์ํ ๊ฐ๋ค์ ์๋ก ๋์ด์ฌ๋ฆฌ๋ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ๋ชจ์ต๋๋ฌธ์ ํธ์ด์คํ ์ด๋ผ๊ณ ๋ถ๋ฅด๊ณ ์๋ ๊ฒ์ด์ฃ . ๋จ, ์ค์ ๋ก๋ ์์ค์ฝ๋๊ฐ ์๋ก ๋์ด์ฌ๋ ค์ง๋ ๊ฒ์ ์๋๋ฉฐ, ์๋ฐ์คํฌ๋ฆฝํธ Parser ๋ด๋ถ์ ์ผ๋ก ๋์ด์ฌ๋ ค์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด๊ณ ์ค์ ๋ฉ๋ชจ๋ฆฌ ์์์๋ ๋ณํ๊ฐ ์์ต๋๋ค.
๋๊ฐ์ ์์๋ฅผ ํตํด ํธ์ด์คํ ์ ๋ํด ์ดํด๋ฅผ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
function foo() {
a = 2;
var a;
console.log(a);
}
foo();
์์ ์์ค์ฝ๋๋ฅผ ์คํํ๋ฉด ์ฐ๋ฆฌ๊ฐ ํ๋์ ๋ณด๊ธฐ์๋ ๋ฌธ๋ฒ์ ์ผ๋ก ๋ฌธ์ ๊ฐ ์์ด๋ณด์ด๊ณ , ์คํ๊ฒฐ๊ณผ ๋ํ ์์ธกํ๋๋ก 2๋ผ๋ ๊ฐ์ด ์ ๋๋ก ์ถ๋ ฅ์ด ๋์ด์ง๊ฒ๋๋ค.
๊ทธ๋ผ ์์ค์ฝ๋์์ ์์๋ฅผ ์กฐ๊ธ ๋ฐ๊ฟ ์๋์ ์์ค์ฝ๋๋ฅผ ์คํ์์ผ ๋ณด๊ฒ ์ต๋๋ค.
function foo() {
console.log(a);
var a = 2;
}
foo();
๋ฌด์ธ๊ฐ ์ ์ธํ์ง๋ ์์ ๋ณ์๋ฅผ ๋จผ์ ์ฌ์ฉํ๊ณ ์๋ ๋ชจ์ต์์ ๋ถํฐ๊ฐ ๋ฌธ๋ฒ์ ์ผ๋ก ๋ฌธ์ ๊ฐ ์์ด๋ณด์ด๋๋ฐ์.
ํ์ง๋ง var ๋ณ์๋ ์์ ์ด์ผ๊ธฐํ๋ ํจ์ ์ค์ฝํ์ด๊ธฐ ๋๋ฌธ์ ํจ์๋ด์์ ์ ์ธํ๊ฒ์ ์ ์ธ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์์๋ ์๋๋๊ฐ์ ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด ์์ค์ฝ๋๋ ๋๊ฐ์ด 2๋ผ๋ ๊ฒฐ๊ณผ๊ฐ์ด ๋์ฌ๊น์? ๋๋ต์ ์๋์ค ์ ๋๋ค. ์์ ๊ฒฐ๊ณผ๋ก๋ undefined ๊ฐ ์ถ๋ ฅ์ด ๋์ด์ง๋๋ฐ์. ์ด ๊ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฏธ๋ฆฌ ์ ์๋ ์์๊ฐ์ด๋ฉฐ ์๋ฏธ๋ก๋ "์ ์ธ์ด ๋์ด์์ง ์์" ์ ์๋ฏธํฉ๋๋ค. ๋ถ๋ช var a = 2 ๋ผ๊ณ ์ด๊ธฐํ๋ฅผ ํ๋๋ฐ ์ ์ ์ธ์ด ๋์ด์์ง ์๋ค๊ณ ํ๋์ง์ ๋ํ์ฌ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ฝ๋๋ฅผ ์ธํฐํ๋ฆฌํ ํ๊ธฐ ์ ์ ๊ทธ ์ฝ๋๋ฅผ ๋จผ์ ์ปดํ์ผํฉ๋๋ค. var a = 2๋ฅผ ํ๋์ ๊ตฌ๋ฌธ์ผ๋ก ์๊ฐํ์ง ์๊ณ ๋ค์์ ๋๊ฐ ๊ตฌ๋ฌธ์ผ๋ก ๋ถ๋ฆฌํ์ฌ ๋ด ๋๋ค.
- var a; (์ ์ธ)
- a = 2; (ํ ๋น=์ด๊ธฐํ)
๋ณ์ ์ ์ธ ๋จ๊ณ์ ์ด๊ธฐํ ๋จ๊ณ๋ฅผ ๋๋๊ณ , ์ ์ธ ๋จ๊ณ์์๋ ๊ทธ ์ ์ธ์ด ์์ค์ฝ๋์ ์ด๋์ ์์นํ๋ ํด๋น ์ค์ฝํ์ ์ปดํ์ผ ๋จ๊ณ์์ ์ฒ๋ฆฌํด ๋ฒ๋ฆฌ๋ ๊ฒ์ ๋๋ค. ๋๋ฌธ์ ์ด๋ฐ ์ ์ธ๋จ๊ณ๊ฐ ์ค์ฝํ์ ๊ผญ๋๊ธฐ๋ก ํธ์ด์คํ ("๋์ด์ฌ๋ฆผ")๋๋ ์์ ์ด๋ผ๊ณ ๋ณผ ์ ์๋ ๊ฒ์ด์ฃ .
[ํธ์ด์คํ ๋์]
์ด๋ฌํ ํธ์ด์คํ ์ด ๋ฐ์๋๋ ๋์์๋ ๋ฌด์์ด ์์๊น์?
ํธ์ด์คํ ์ var๋ณ์ ์ ์ธ๊ณผ ํจ์์ ์ธ๋ฌธ์์๋ง ์ผ์ด๋ฉ๋๋ค.
- var๋ฉด์/ํจ์์ ์ ์ธ๋ง ์๋ก ๋์ด ์ฌ๋ ค์ง๋ฉฐ, ํ ๋น์ ๋์ด ์ฌ๋ ค์ง์ง ์๋๋ค.
- let/const ๋ณ์ ์ ์ธ๊ณผ ํจ์ ํํ์์์๋ ํธ์ด์คํ
์ด ๋ฐ์ํ์ง ์๋๋ค.
(var ๋ณด๋จ let ๊ณผ const๋ฅผ ์ฌ์ฉํ์)-
ํจ์ ํํ์์ด๋ ์ต๋ช ํจ์๋ฑ์ ์ด์ฉํ ํจ์์ฌ์ฉ์ ์๋ฏธํฉ๋๋ค.
-
[ํธ์ด์คํ ์ ๋ฌธ์ ]
ํธ์ด์คํ ์ด ์์ฃผ ๋ฐ์ํ๊ฒ ๋๋ค๋ฉด ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ํด์ํ๋ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๊ฒ ๋๊ณ ์ด๋ ์ ์ง๋ณด์์ ์ด๋ ค์์ผ๋ก ์ด์ด์ง๊ฒ ๋ฉ๋๋ค.
์ฐธ๊ณ ์ฌ์ดํธ