์คํ ์ปจํ ์คํธ๋ ์์ฑ๊ณผ ์คํ ๋จ๊ณ๋ก ๋๋๋ค. ํธ์ด์คํ ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์คํ ์ปจํ ์คํธ๋ฅผ ์์ฑํ๋ ๋จ๊ณ์์, ์คํ ์ปจํ ์คํธ์ scope๋ฅผ ์ ์ํ ๋, ๋ณ์๋ ํจ์ ์ ์ธ๋ฌธ์ ์ค์ฝํ์ ์ต์๋จ์ผ๋ก ๋์ด์ฌ๋ฆฌ๋ ๊ฒ์ ๋งํ๋ค.
๋ค์ ๊ตฌ๋ฌธ์ด ์์ ๋,
var variable = "variable";์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ปดํ์ผ ๊ณผ์ ์์ ์ด๋ฅผ ์ ์ธ๋ฌธ๊ณผ ํ ๋น๋ฌธ์ผ๋ก ๋๋์ด์ ํด์ํ๋ค.
var variable; // ์ ์ธ๋ฌธ
variable = "variable"; // ํ ๋น๋ฌธ
ํธ์ด์คํ ์ ์ด ์ ์ธ๋ฌธ์ ์ค์ฝํ์ ์ต์๋จ์ผ๋ก ๋์ด์ฌ๋ฆฌ๋ ๊ฒ์ด๋ค.
console.log(a); // undefined
var a = 'hi';
console.log(a); // hi๋ณ์๋ '์ปดํ์ผ'๊ณผ์ ์์ ์ค์ฝํ์ ์ต์๋จ์ผ๋ก ๋์ด์ฌ๋ ค์ ธ์, ๋ณ์ ๊ฐ์ฒด์ ์ถ๊ฐ๋๋ค. ์ด ๋ ํ๋กํผํฐ๋ ๋ณ์ ์ด๋ฆ, ๊ฐ์ undefined๋ก ์ด๊ธฐํ๋๋ค. ๋ฐ๋ผ์ ๋ณ์ ์ ์ธ๋ฌธ ์ด์ ์, ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ค. ํจ์๊ฐ ์คํ๋๊ณ ํ ๋น๋ฌธ์์ ๋น๋ก์ a๋ 'hi'๋ก ํ ๋น๋๋ค.
let๊ณผ const์ ๊ฒฝ์ฐ์๋ ํธ์ด์คํ ์ด ์ผ์ด๋์ง๋ง, ์ ์ธ๋ฌธ ์ด์ ์ ์ฐธ์กฐํ๋ ค๊ณ ํ๋ฉด Reference Error๊ฐ ๋ฐ์๋๋ค. ๋ณ์ ์ ์ธ๋ฌธ์ด ์ค์ฝํ ์ต์๋จ์ผ๋ก ๋์ด์ฌ๋ ค์ง๊ธฐ๋ ํ๋ค. ํ์ง๋ง, ํจ์๊ฐ ์คํ๋๋ฉฐ ์ ์ธ๋ฌธ์ ๋๋ฌํด์ผ ๋ณ์๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ๋ณด๋๊ณ undefined๋ก ์ด๊ธฐํ๊ฐ ๋๋ค. ์ค์ฝํ ์ต์๋จ๋ถํฐ ์ ์ธ๋ฌธ ์ ๊น์ง๋ฅผ ์ผ์์ ์ฌ๊ฐ ์ง๋(Temporal Dead Zone; TDZ) ๋ผ๊ณ ํ๋ค.
{
console.log(apple); //ReferenceError: Cannot access 'apple' before initialization
let apple;
apple = "apple";
}ReferenceError: Cannot access 'apple' before initialization ์ด ์๋ฌ๋ฅผ ํตํด 'apple'์ heap memory์ ์ด๋ฏธ ์กด์ฌํ์ง๋ง, ์ด๊ธฐํ๋ ์ด๋ฃจ์ด์ง์ง ์์์์ ์ ์ ์๋ค.
ํจ์ ์ ์ธ๋ฌธ์ ๊ฒฝ์ฐ์๋ ํธ์ด์คํ ์ด ๋๋ค. ์ปดํ์ผ ๊ณผ์ ์์ ํจ์๋ ๋ณ์ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ก ํจ์ ์ด๋ฆ์ด, ๊ฐ์ผ๋ก๋ ํจ์ ๊ฐ์ฒด๊ฐ ๋ฑ๋ก์ด ๋๋ค. ๋ฐ๋ผ์, ํจ์ ์ ์ธ๋ฌธ ์ด์ ์๋ ํจ์ ํธ์ถ์ ํ ์ ์๊ฒ ๋๋ค.
func(); //func ํจ์ ํธ์ถ
function func() {
console.log("func ํจ์ ํธ์ถ");
}์ด ๋, ์ฃผ์ํ ์ ์ ํจ์ ํํ์์ ๋ณ์ ํธ์ด์คํ ์ผ๋ก ์ฒ๋ฆฌ๋๋ค๋ ์ ์ด๋ค. ์ฆ, ์ปดํ์ผ ๋ ๋ ํจ์ ํํ์์ ๋ณ์ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ํจ์์ด๋ฆ, ๊ฐ์ undefined๋ก ๋ฑ๋ก๋๋ค.
console.log(hello); // undefined
hello(); // TypeError: hello is not a function
var hello = function () {
console.log("hello ํจ์ ํธ์ถ");
};ํจ์ ํํ์์ ํจ์ ์ ์ธ๋ฌธ ์ด์ ์ ํธ์ถํ์ฌ๋ ํธ์ด์คํ ๋๋ฏ๋ก ์ฐธ์กฐ๋ ํ ์ ์์ง๋ง, ๊ทธ ๊ฐ์ undefined์ธ ๊ฒ์ ํ์ธํ ์ ์๋ค.
ํจ์ ํธ์ด์คํ ์ด ์ผ์ด๋๊ณ , ๊ทธ ๋ค์ ๋ณ์ ํธ์ด์คํ ์ด ์ผ์ด๋๋ค.
{
quit(); // ํจ์ ํธ์ด์คํ
- A
var quit = function () { // B
console.log("๋ณ์ ํธ์ด์คํ
");
};
function quit() {
console.log("ํจ์ ํธ์ด์คํ
");
}
quit(); // ๋ณ์ ํธ์ด์คํ
- C
}์ปดํ์ผ ๊ณผ์ ์์, ํจ์ ์ ์ธ๋ฌธ์ด ์ค์ฝํ์ ์ต์๋จ์ผ๋ก ๋์ด์ฌ๋ ค์ ธ์, ๋ณ์ ๊ฐ์ฒด์ ํจ์์ด๋ฆ์ธ quit๊ณผ quit ํจ์ ๊ฐ์ฒด๊ฐ ๋ฑ๋ก๋๋ค. quit์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ์ธ๋ฌธ์ด ๋์ด์ฌ๋ ค์ก์ผ๋ฏ๋ก, quit ๋ณ์ ํธ์ด์คํ ์ ์ผ์ด๋์ง ์๊ฒ ๋๋ค. ๋ฐ๋ผ์ A์ง์ ์์ ํจ์ ํธ์ถ์ ํ๋ฉด, ํจ์ ๊ฐ์ฒด๊ฐ ์คํ๋์ด 'ํจ์ ํธ์ด์คํ '์ ์ถ๋ ฅํ๋ค. ํจ์๊ฐ ์คํ๋๋ฉด์, B์ง์ ์ ์ด๋ฅด๊ฒ ๋๋ฉด, quit์ด๋ผ๋ ์ด๋ฆ์ ์๋ก์ด ํจ์๊ฐ ํ ๋น๋๋ค. ๋ฐ๋ผ์ C์ง์ ์์๋ '๋ณ์ ํธ์ด์คํ '์ ์ถ๋ ฅํ๊ฒ ๋๋ค.