ํธ์ด์คํ (hoisting)
์ธํฐํ๋ฆฌํฐ๊ฐ ๋ณ์์ ํจ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ธ ์ ์ ๋ฏธ๋ฆฌ ํ ๋นํ๋ ๊ฒ์ ์๋ฏธํ๋ค. var๋ก ์ ์ธํ ๋ณ์์ ๊ฒฝ์ฐ ํธ์ด์คํ ์ undefined๋ก ๋ณ์๋ฅผ ์ด๊ธฐํํ๋ค. ๋ฐ๋ฉด let๊ณผ const๋ก ์ ์ธํ ๋ณ์์ ๊ฒฝ์ฐ ํธ์ด์คํ ์ ๋ณ์๋ฅผ ์ด๊ธฐํํ์ง ์๋๋ค. ๋ฐ๋ผ์ var๋ก ์ ์ธํ ์ ์ด๊ธฐํ ๊ฐ, undefined๊ฐ ๋์ค๋ ๊ฒ๊ณผ ๋ค๋ฅด๊ฒ, const์ let์ ์ด๊ธฐํ ๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๋ฅผ ์ถ๋ ฅํ๋ค.
Temporal Dead Zone
๋ณ์๊ฐ ํ์ฌ ์ค์ฝํ ๋ด์์ ์ ์ธ๋์ง๋ง, ์์ง ์ด๊ธฐํ๋์ง ์์ ์ํ๋ฅผ ๋งํ๋ค. let ๋๋ const ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ์๋ฅผ ์ ์ธํ์ ๋ ๋์ค๋ ๊ฐ๋ . TDZ๋ ๋ณ์๊ฐ ์ ์ธ๋ ์ง์ ๋ถํฐ ์ด๊ธฐํ๋๊ธฐ ์ ๊น์ง, ํด๋น ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ค.
TDZ์ ๋น ์ง ์์
age = 20;
// Uncaught ReferenceError: Cannot access 'age' before initialization
let age;
๊ทธ๋ผ let๊ณผ const๋ ํธ์ด์คํ ๋์ง ์๋ ๊ฒ์ธ๊ฐ?
let์ด ํธ์ด์คํ ๋์ง ์๋ "๊ฒ์ฒ๋ผ" ๋ณด์ด๋ ์์
console.log(name);
//ReferenceError: name is not defined
const name = 'junha';
name ์ ์ธ ์ด์ ์ ํธ์ถ์ reference error๊ฐ ๋์ let์ ํธ์ด์คํ ์ด ๋์ง ์๋๋ค๊ณ ์๊ฐํ ์ ์๋ค. ํ์ง๋ง ํธ์ด์คํ ๋์ง ์์์๊ฐ ์๋๋ผ let์ ๋ณ์ ์์ฑ๊ณผ์ ์ด var์ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค.
var, let, const์ ๋ณ์ ์์ฑ๊ณผ์ ๋น๊ต
(๊ธฐ๋ณธ์ ์ผ๋ก ๋ณ์๋ ์ ์ธ-์ด๊ธฐํ-ํ ๋น์ 3๋จ๊ณ ์์ฑ๊ณผ์ ์ ๊ฐ์ง)
- var : ์ ์ธ&์ด๊ธฐํ ๋์์ ์ด๋ค์ง. (์ ์ธ๋ถ & ์ด๊ธฐํ ์ธํธ๋ก ๋ค๋)
- let : ์ ์ธ - ์ด๊ธฐํ ๋ถ๋ฆฌ๋์ด ์งํ (์ ์ธ๋ถ๋ง ๋จ๋ ์ผ๋ก ํธ์ด์คํ ๋จ)
- const : ์ ์ธ&์ด๊ธฐํ ๋์์ ํด์ผ ํจ. (์ ์ธ๋ถ & ์ด๊ธฐํ ์ธํธ๋ก ์ ์ํด์ค์ผ ํ์ง๋ง ์ธํธ๋ก ํธ์ด์คํ ๋์ง ์์)
⇒ let์ผ๋ก ์ ์ธํ name์ ๋งจ ์๋ก ์ ์ธ๋ถ๊ฐ ํธ์ด์คํ ์ด ๋๊ธด ๋์ผ๋, ์ด๊ธฐํ(๋ฉ๋ชจ๋ฆฌ ํ ๋น)๊ฐ ์์ง ๋์ง ์์๊ธฐ ๋๋ฌธ์ reference error๊ฐ ๋๊ฒ ๋๋ ๊ฒ์ด๋ค.
age = 4;
let age;
// Cannot access 'age' before initialization
const์ let์ ๋์ผ ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ์ค๋ฅ๋ฅผ ๋ ๋ฆฐ๋ค.
var a = 0
const b = 1;
let c = 2;
console.log(a, b); // 1,2
var a = 3
const b = 4;
let c = 5;
// Uncaught SyntaxError: Identifier 'a' has already been declared
// Uncaught SyntaxError: Identifier 'b' has already been declared
Block Scope
var์ ํจ์ ์ค์ฝํ๋ฅผ ๊ฐ์ง๋ฉฐ, ๋ธ๋ก ๋ด์์ ์ ์ธํด๋ ํจ์ ์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅํ๋ฉฐ ๋ณ์ ์ฌํ ๋น์ด ๊ฐ๋ฅํ๋ค.
const๋ ๋ธ๋ก ์ค์ฝํ๋ฅผ ๊ฐ์ง๋ฉฐ, ๋ธ๋ก ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๋ค.
{
var age = 20;
const name = 'junha';
}
console.log(age);
// 20
console.log(junha);
// Uncaught ReferenceError: junha is not defined
const์ let์ window์ ๋ฐ์ธ๋ฉ ๋์ง ์๋๋ค.
var๋ก ์ ์ธํ ๋ณ์๋ window ๊ฐ์ฒด์ ํ๋กํผํฐ์ ์ ์ฅ๋๋ค. ES5๊น์ง๋ ์ฌ์ฉ์๊ฐ ์์๋ก ๋ง๋ ๋ณ์๊ฐ ๋ชจ์กฐ๋ฆฌ window๋ก ๋ฐ์ธ๋ฉ ๋๊ธฐ ๋๋ฌธ์, window๊ฐ ์ค์ผ์ด ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ค. ES6๋ถํฐ๋ let, const ๋ฐ ํด๋์ค ์๋ณ์ ๋ฐ์ธ๋ฉ์ window ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ ๋์ง ์๊ธฐ ๋๋ฌธ์, ๋์ด์ window์ ํ๋กํผํฐ๋ก ์ ๊ทผํ ์๊ฐ ์๋ค. ์ ์ญ ๊ฐ์ฒด๊ฐ ์๋๋ผ *๋ณ๋์ ์ ์ธ์ ํ๊ฒฝ ๋ ์ฝ๋์ ๋ณด๊ด๋๋ค. (ํฌ๋กฌ ๋๋ฒ๊ฑฐ๋ Script๋ผ๋ ์ด๋ฆ์ผ๋ก ์ค์ฝํ๋ฅผ ๋ถ๋ฅํ๊ณ ์๋ค.)
* ์ ์ญ ์คํ์ปจํ ์คํธ์ Lexical environment object์ environment record(=Variable Object)