์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ณ์๋ฅผ ์ ์ธํ ๋ var, let, const๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ด ์ธ ๊ฐ๋ ์ฝ๊ฐ์ฉ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ํ๋ฏ๋ก ์ ์ ์ฐจ์ด์ ์ ์์๋๊ณ ์ ๋๋ก ์ฌ์ฉํด์ผ ํ๋ค!
var
- ES6 ๋์ค๊ธฐ ์ด์ ์ ์์ฃผ ์ผ๋ ๊ฐ์ฅ ์ค๋๋ ๋ฐฉ์์ด๋ค.
- ์ค๋ณต ์ ์ธ๊ณผ ์ฌํ ๋น์ด ๋ชจ๋ ๊ฐ๋ฅํ๋ค.
var letter = 'first';
console.log(letter); // first
var letter = 'second';
console.log(letter); //second
letter = 'third';
console.log(letter);//third
์ฝ๋๋ฅผ ๋ณด๋ฉด, ์ค๋ณต ์ ์ธ์ด ๊ฐ๋ฅํ๊ณ , ๊ฐ์ฅ ๋ง์ง๋ง์ผ๋ก ํ ๋น๋ ๊ฐ์ด ์ต์ข ๋ณ์์ ์ ์ฅ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
- ํจ์์์ ์ ์ธ๋ ๋ณ์๋ ํจ์ ๋ด์์๋ง ์ ํจํ ํจ์ ์ค์ฝํ๋ฅผ ๊ฐ์ง๋ค.
var x = 10;
function letter() {
var x = 20;
console.log(x); // 20
}
console.log(x); // 10
- TDZ๊ฐ ์๋ค.
var๋ ์ค๋ณต ์ ์ธ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋ณต์กํ ์ฝ๋์ ๊ฒฝ์ฐ, ์์์ ์ ์ธํ ์ค ๋ชจ๋ฅด๊ณ ๋ฐ์์ ๋ ์ ์ธํด๋ฒ๋ ค๋ ์ค๋ฅ๊ฐ ์ ๋ฌ๋ค๋ ๋จ์ ์ด ์๋ค. ๊ทธ๋์ ES6์์ ๋ฑ์ฅํ ๊ฒ let๊ณผ const์ด๋ค.
let
- ์ค๋ณต ์ ์ธ์ ์ ๋์ง๋ง ์ฌํ ๋น์ ๊ฐ๋ฅํ๋ค.
let letter = 'first';
console.log(letter); // first
let letter = 'second';
console.log(letter); ////Uncaught SyntaxError: Identifier 'letter' has already been declared
letter = 'third';
console.log(letter);//third
์ฝ๋๋ฅผ ๋ณด๋ฉด, ์ค๋ณต ์ ์ธ์ ํ๋ฉด syntaxError๊ฐ ๋จ๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ฌํ ๋น์ ๊ฐ๋ฅํ๋ค!
- ๋ธ๋ก ์ค์ฝํ๋ฅผ ๊ฐ์ง๋ค.
- TDZ๊ฐ ์กด์ฌํ๋ค.
const
- ์ค๋ณต ์ ์ธ๊ณผ ์ฌํ ๋น์ด ๋ชจ๋ ๋ถ๊ฐํ๋ค.
const letter = 'first';
console.log(letter); // first
const letter = 'second';
console.log(letter); ////Uncaught SyntaxError: Identifier 'letter' has already been declared
letter = 'third';
console.log(letter);////Uncaught TypeError: Assignment to constant variable
์ฝ๋๋ฅผ ๋ณด๋ฉด, ์ค๋ณต ์ ์ธ, ์ฌํ ๋น ์ ๋ชจ๋ ์๋ฌ๊ฐ ๋จ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
const x = 10;
x = 20;
console.log(X) //Uncaught TypeError: Assignment to constant variable
const arr = [1, 2, 3];
arr.push(4);
console.log(arr) // [1,2,3,4]
ํ์ง๋ง, const๋ก ์ ์ธ๋ ๊ฐ์ฒด, ๋ฐฐ์ด์ ๋ด๋ถ ์์๋ ์์ ์ด ๊ฐ๋ฅํ๋ค!
- ๋ธ๋ก ์ค์ฝํ๋ฅผ ๊ฐ์ง๋ค.
- TDZ๊ฐ ์กด์ฌํ๋ค.
var, let, const ์ฐจ์ด์
์ ๋ฆฌํ์๋ฉด ์ ์ธ ๊ฐ์ง ๋ฐฉ์์ ์ฐจ์ด์ ์ ๋ณ์ ์ ์ธ ๋ฐฉ์, ์ค์ฝํ, ๋ณ์ ํธ์ด์คํ ๋ฐฉ์ ์ด๋ ๊ฒ ์ธ ๊ฐ์ง๊ฐ ์๋ค.
์ด ์ธ ๊ฐ์ง ๋ฐฉ์์ ์ฐจ์ด์ ์ ์ ์์๋์ด์ผ ํ๋ค..!
๋ณ์ ์ ์ธ ๋ฐฉ์
var๋ฅผ ๋ณด์ํ ๊ฒ let, const์ด๊ธฐ ๋๋ฌธ์ var๋ ์ ์ฐ๋ ๊ฑธ ์ถ์ฒํ๊ณ , ์ฌํ ๋น์ด ๊ฐ๋ฅํด์ผ ํ ๋๋ let, ์ฌํ ๋น์ด ํ์ ์์ ๋๋ const๋ฅผ ์ฐ๋ฉด ๋๋ค.
- var : ์ค๋ณต ์ ์ธ O, ์ฌํ ๋น O
- let : ์ค๋ณต ์ ์ธ X, ์ฌํ ๋น O
- const: ์ค๋ณต ์ ์ธ X, ์ฌํ ๋น X
์ค์ฝํ(scope)
์ ํจํ ์ฐธ์กฐ ๋ฒ์๋ฅผ ์ค์ฝํ๋ผ๊ณ ํ๋ค.
- var : ํจ์ ๋ ๋ฒจ ์ค์ฝํ(function-level scope)
- let, const : ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ(block-level scope) => ์ค๊ดํธ{} ์์์๋ง ์ ํจํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
function example() {
var x = 10;
if (true) {
var y = 20; // ํจ์ ์ค์ฝํ
let z = 30; // ๋ธ๋ก ์ค์ฝํ
}
console.log(x); // 10
console.log(y); // 20
console.log(z); // error
}
๋ณ์ ํธ์ด์คํ (Hoisting) ๋ฐฉ์
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ณ์ ์ฒ๋ฆฌ ๊ณผ์ ์ 3๋จ๊ณ๋ก ์งํ๋๋ค.
- ์ ์ธ ๋จ๊ณ(Declaration phase)
- ๋ณ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋ฑ๋กํ๋ค.
- ์ด๊ธฐํ ๋จ๊ณ(Initialization phase)
- ๋ณ์ ๊ฐ์ฒด์ ๋ฑ๋ก๋ ๋ณ์๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋นํ๋ค
- ์ด๋ ๋ณ์๋ undefined์ผ๋ก ์ด๊ธฐํ๋๋ค.
- ํ ๋น ๋จ๊ณ(Assignment phase)
- undefined๋ก ์ด๊ธฐํ๋ ๋ณ์์ ์ค์ ๊ฐ์ ํ ๋นํ๋ค.
ํธ์ด์คํ ?
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ ๋ชจ๋ ์ ์ธ(var, let, const, function, class ... )์ ์ค์ฝํ์ ๋ฑ๋กํ๋ค.
์ด๋ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ ์ ์ธ ๋จ๊ณ๊ฐ ํด๋น ์ค์ฝํ์ ์ต์๋จ์ผ๋ก ๋์ด์ฌ๋ ค์ง๋ ๊ฒ ๊ฐ์ “ํ์”(์ค์ ๋ก ๋์ด์ฌ๋ฆฌ๋ ๊ฒ ์๋) ์ ํธ์ด์คํ ์ด๋ผ๊ณ ํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ ์ ์ธ์ ํธ์ด์คํ ์ด ์ผ์ด๋๋ค. ํ์ง๋ง let, const, class๋ ํธ์ด์คํ ์ด ์ผ์ด๋์ง ์๋ ๊ฒ์ฒ๋ผ ๋์ํ๋ค. var๋ ์ ์ธ+์ด๊ธฐํ ๋จ๊ณ๊ฐ ํ ๋ฒ์ ์ผ์ด๋๋ ๋ฐ๋ฉด, let๊ณผ const๋ ์ด๊ธฐํ๋์ง ์์ ์ฑ๋ก ์ ์ธ๋ง ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์ฐธ์กฐ ์๋ฌ(reference error)๋ฅผ ๋ฐ์์ํจ๋ค.
let๊ณผ const๊ฐ ํธ์ด์คํ ์ด ์ ์ผ์ด๋๋ ๊ฒ ์๋๋ค!! reference error๊ฐ ๋ฌ๋ค๋ ๊ฒ๋ ํธ์ด์คํ ๋๋ฌธ์ด๋ค.
var
์ ์ธ ๋จ๊ณ์ ์ด๊ธฐํ ๋จ๊ณ๊ฐ ํ ๋ฒ์ ์ด๋ฃจ์ด์ง๋ค. ๋ฐ๋ผ์ ์ฐธ์กฐ ์๋ฌ๊ฐ ์๋ undefined๋ฅผ ๋ฐํํ๋ค. ์ดํ ์ฝ๋๊ฐ ์คํ๋ ๋ค์ ๊ฐ์ด ํ ๋น๋๋ค.
console.log(a); // undefined
var a = 10;
console.log(a); // 10
let, const
- ์ ์ธ ๋จ๊ณ์ ์ด๊ธฐํ ๋จ๊ณ๊ฐ ๋๋ ์ ์งํ๋๋ค. ๋ณ์๋ฅผ ์ ์ธ๋ง ํ๊ณ ์ด๊ธฐํ๋ ์ฝ๋ ์คํ ํ์ ์คํ๋๋ค. ๋ฐ๋ผ์ ์ด๊ธฐํ ์ด์ ์ ๋ณ์์ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด ์ฐธ์กฐ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
- ์ค์ฝํ์ ์์ ์ง์ ๋ถํฐ ์ด๊ธฐํ ์์ ์ง์ ๊น์ง๋ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋๋ฐ, ์ด ๊ตฌ๊ฐ์ TDZ(Temporal Dead Zone, ์ผ์์ ์ฌ๊ฐ์ง๋)๋ผ๊ณ ํ๋ค.
console.log(a); // ReferenceError: a is not defined
console.log(b); // ReferenceError: b is not defined
let a = 10;
const b = 20;
๐null ๐ undefined ๐ undeclared
- ๋ณ์ ์ ์ธ ์ ๋ฌด
- null, defined : ๋ณ์ ์ ์ธ O
- undeclared : ๋ณ์ ์ ์ธ X
- null
- ๊ฐ์ด ์์, ๋ฌดํจ๋ฅผ ๋ํ๋ด๋ ๊ฐ์ด๋ค!!
- undefined
- ๋ณ์๊ฐ ์ ์ธ๋์์ง๋ง ๊ฐ์ ํ ๋นํ์ง ์์์ ๋ ๋ํ๋๋ค.
- var๋ก ํ ๋นํ ๋ณ์ ํธ์ด์คํ ์์ undefined์ด ๋จ๋ ์ด์ ๋ ๋ณ์๊ฐ ์ ์ธ+์ด๊ธฐํ ๋จ๊ณ๋ฅผ ์ฝ๋ ์คํ ์ ์ํํด undefined ์ํ๋ก ๋ง๋ค์ด๋๊ธฐ ๋๋ฌธ์ด๋ค.
- undeclared
- ์ ์ธ๋์ง ์์ ๋ณ์์ ์ ๊ทผํ ๋ ๋ํ๋๋ค.
- let, const๋ก ํ ๋นํ ๋ณ์ ํธ์ด์คํ ์์ ๋จ๋ ์ฐธ์กฐ์๋ฌ(ReferenceError)๊ฐ undeclared ์ํ์ด๋ค.