์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ณ์๋ฅผ ์ ์ธํ๋ ๋ฐฉ๋ฒ์ var
, let
, const
๊ฐ ์๋ค.
์ด๋ฒ ๊ธ์์๋ ๊ฐ๊ฐ์ ํน์ง๊ณผ ์ฐจ์ด์ ๋ํด ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค.
๐งฉ ์ค์ฝํ(Scope)๋?
var
, let
, const
๋ฅผ ๋ค๋ฃจ๊ธฐ ์ ์ ์ค์ฝํ ๊ฐ๋
์ ๋ํด ๋จผ์ ์ ๋ฆฌํ๊ณ ์ ํ๋ค.
์ค์ฝํ๋ ๋ณ์๊ฐ ์ ํจํ๊ฒ ์ฌ์ฉ๋ ์ ์๋ ๋ฒ์๋ฅผ ์๋ฏธํ๋ค.
(→ ์ด๋๊น์ง ์ด ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋์ง๋ฅผ ๊ฒฐ์ ํ๋ ๊ท์น)
์๋ฐ์คํฌ๋ฆฝํธ๋ ํฌ๊ฒ ๋ ๊ฐ์ง ์ค์ฝํ๊ฐ ์๋ค.
- ํจ์ ์ค์ฝํ(Function Scope)
- ํจ์ ๋จ์๋ก ๋ณ์๊ฐ ๊ตฌ๋ถ๋๋ค.
- ํจ์ ์ธ๋ถ์์๋ ํจ์ ๋ด๋ถ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
- ๋ธ๋ก ์ค์ฝํ(Block Scope)
{}
๋ธ๋ก ๋จ์๋ก ๋ณ์๊ฐ ๊ตฌ๋ถ๋๋ค.if
,for
,while
๊ฐ์ ์ ์ด๋ฌธ ๋ด๋ถ์์ ์ ์ธํ ๋ณ์๋ ๋ธ๋ก ์์์๋ง ์ ํจํ๋ค.
๐น var์ ํน์ง๊ณผ ๋ฌธ์ ์
var number; // ์ ์ธ
number = 1; // ํ ๋น
var number1 = 1; // ์ ์ธ๊ณผ ํ ๋น์ ๋์์
number1 = 2; // ์ฌํ ๋น ๊ฐ๋ฅ
var
ํค์๋๋ ์ ์ธ๊ณผ ํ ๋น์ ๋ฐ๋ก ํ ์๋ ์๊ณ
๋์์(์ ์ธ + ํ ๋น) ํ ์๋ ์์ผ๋ฉฐ ๊ฐ์ ์ฌํ ๋น๋ ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง var
๋ ํ์ฌ ํ๋ก์ ํธ์์ ์ ์ฌ์ฉํ์ง ์์ ๋ฟ๋๋ฌ
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฒ์ ๋ฐฐ์ธ ๋ var
๋ ์ฌ์ฉํ์ง ๋ง๋ผ๊ณ ๋ฐฐ์ฐ๊ธฐ๋ ํ๋ค.
๊ทธ ์ด์ ๋ ์๋์ ๊ฐ๋ค.
1) ์ค๋ณต ์ ์ธ ํ์ฉ
var number1 = 1;
console.log(number1) // 1;
...
var number1 = 3; // ๊ฐ์ ์ด๋ฆ์ผ๋ก ์ฌ์ ์ธ
console.log(number1); // 3
var
๋ ๋๊ฐ์ ์ด๋ฆ์ผ๋ก ๋ณ์๋ฅผ ํ ๋ฒ ๋ ์ ์ธํ๊ฒ ๋๋ฉด
์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด ์๋๋ผ ์ด์ ๋ณ์๋ฅผ ๋ฎ์ด์ฐ๊ฒ ๋๋ค.
์ด๋ฌํ ์ค๋ณต ์ ์ธ ํ์ฉ์ ์ฝ๋๊ฐ ๊ธธ์ด์ง์๋ก ์ค์๋ฅผ ์ ๋ฐํ ์ ์๊ธฐ ๋๋ฌธ์
์์ ์ฑ์ด ๋จ์ด์ง๊ณ ์ ์ง๋ณด์์ ๋ถ๋ฆฌํ๋ค.
2) ํจ์ ์ค์ฝํ
{
var x = 3;
}
function myFunction() {
var y = 4;
}
console.log(x); // 3
console.log(y); // Uncaught ReferenceError: y is not defined
var
๋ ํจ์์ค์ฝํ(function scope)๋ฅผ ๊ฐ์ง๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ธ๋ก({}
) ๋ด๋ถ์์ ์ ์ธํด๋ ํจ์๊ฐ ์๋๋ผ๋ฉด ์ ์ญ์์ ์ ๊ทผํ ์ ์๋ค.
์ด๋ก ์ธํด if
, for
๋ฑ ๋ธ๋ก๋ฌธ ๋ด์์ ๋ณ์๋ฅผ ์์ ํ๊ฒ ๊ด๋ฆฌํ๊ธฐ ์ด๋ ต๋ค.
3) ํธ์ด์คํ (Hoisiting)
console.log(number); // undefined
var number = 2;
console.log(number); // 2
// ์ฝ๋ ๋์ ๋ฐฉ์
var number; // ํธ์ด์คํ
์ผ๋ก ์ ์ธ๋ถ๊ฐ ์ต์๋จ์ผ๋ก ์ด๋๋๊ณ undefined๋ก ์ด๊ธฐํ๋จ
console.log(number); // undefined
number = 2; // ํ ๋น์ ์๋ ์์น์์ ์คํ๋จ
console.log(number); // 2
ํธ์ด์คํ (Hoisting)์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด
์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ ์ ๋ณ์ ์ ์ธ์ ๋จผ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค๋๋ ๋์ ๋ฐฉ์์ด๋ค.
(๋ณ์ ์ ์ธ๋ถ๊ฐ ์๋ก ๋์ด์ฌ๋ ค์ง)
var
๋ ํธ์ด์คํ
์ด ๋ ๋, undefined
๋ก ์๋ ์ด๊ธฐํ๊ฐ ๋๊ธฐ ๋๋ฌธ์
์ ์ธ ์ ์ ์ฐธ์กฐํด๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
var
๋ ์ด์ ๊ฐ์ด ์์ธกํ๊ธฐ ์ด๋ ค์ด ๋์์ ๋ง๋ค์ด๋ผ ์ ์์ด์ ๋ฌธ์ ๊ฐ ๋๋ค.
๐ถ let๊ณผ const
์์ ๊ฐ์ var
์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด
ES2015๋ถํฐ let
๊ณผ const
๋ผ๋ ํค์๋๊ฐ ๋ฑ์ฅํ๋ค.
let a; // ์ ์ธ
a = 1; // ํ ๋น
let b = 2; // ์ ์ธ๊ณผ ๋์์ ํ ๋น
b = 3; // ์ฌํ ๋น ๊ฐ๋ฅ
const c = 10; // ์ ์ธ๊ณผ ๋์์ ํ ๋น ํ์
c = 20; // ์ฌํ ๋น ๋ถ๊ฐ โ
let
์ var ์ฒ๋ผ ์ ์ธ, ํ ๋น, ์ ์ธ๊ณผ ๋์์ ํ ๋น, ์ฌํ ๋น์ด ๊ฐ๋ฅํ๋ค.
const
๋ ์ ์ธ๊ณผ ๋์์ ์ด๊ธฐํ๋ฅผ ํด์ผํ๊ณ , ์ฌํ ๋น๋ ๋ถ๊ฐ๋ฅํ๋ค.
โ ๏ธ const ๋ถ๋ณ์ฑ
const obj = { a: 1 };
obj.a = 2; // ๊ฐ์ฒด ๋ด๋ถ ๊ฐ ๋ณ๊ฒฝ ๊ฐ๋ฅ โ
console.log(obj); // { a: 2 }
obj = { b: 3 }; // ์ฌํ ๋น ๋ถ๊ฐ โ
const arr = [1, 2, 3];
arr.push(4); // ๋ฐฐ์ด ๋ด๋ถ ๊ฐ ๋ณ๊ฒฝ ๊ฐ๋ฅ โ
console.log(arr); // [1, 2, 3, 4]
arr = [5, 6, 7]; // ์ฌํ ๋น ๋ถ๊ฐ โ
const
๋ก ์ ์ธํ ๋ณ์๋ฅผ ์ฌํ ๋นํ ์ ์๋ค๊ณ ํด์ ๊ฐ์ด ์ ๋๋ก ๋ณ๊ฒฝ๋์ง ์๋ ๊ฒ์ ์๋๋ค.
๊ฐ์ฒด๋ ๋ฐฐ์ด์ ๋ด๋ถ ๊ฐ์ ์์ ํ ์ ์๋ค.
→ ๋ณ์์ ์ฐธ์กฐ ๊ฐ์ ๋ฐ๊ฟ ์ ์๋ ๊ฒ์ด์ง ๋ด๋ถ ๊ฐ์ด ๋ถ๋ณ์ธ ๊ฒ์ ์๋
๐ถ let๊ณผ const์ ์ฅ์
์ฅ์ 1) ๋ธ๋ก ์ค์ฝํ
{
let x = 3;
const y = 4;
}
console.log(x); // ReferenceError: x is not defined
console.log(y); // ReferenceError: y is not defined
let
๊ณผ const
๋ var์ ๋ฌ๋ฆฌ ๋ธ๋ก ์ค์ฝํ๋ฅผ ๊ฐ์ง๋ค.
์ค๊ดํธ๋ก ๊ฐ์ธ์ง ๋ธ๋ก ์์์๋ง ๋ณ์์ ์ ๊ทผํ ์ ์์ด์
var
๋ณด๋ค ์์ ํ๊ฒ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ฅ์ 2) ์ค๋ณต ์ ์ธ ๋ถ๊ฐ
let name = "๊น์ฒ ์";
let name = "๋ฐ์ํฌ"; // SyntaxError: Identifier 'name' has already been declared
const age = 25;
const age = 30; // SyntaxError: Identifier 'age' has already been declared
let
๊ณผ const
๋ ๊ฐ์ ์ค์ฝํ์์
์ค๋ณต ์ ์ธ์ ํ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ์ค์๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
์ฅ์ 3) TDZ (Temporal Dead Zone)
console.log(a); // ReferenceError
let a = 5;
let
๊ณผ const
๋ ํธ์ด์คํ
์ ๋์ง๋ง, TDZ๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๋ง์ ์ ์๋ค.
TDZ๋ ์ฐ๋ฆฌ๋ง๋ก ํ๋ฉด ์ผ์์ ์ฌ๊ฐ์ง๋๋ผ๋ ๋ป์ผ๋ก,
let๊ณผ const๋ก ์ ์ธ๋ ๋ณ์๊ฐ ์ ์ธ๋ ์ค์ฝํ ๋ด์์ ์ด๊ธฐํ๋๊ธฐ ์ ๊น์ง์ ๊ตฌ๊ฐ์ ๋งํ๋ค.
์ด ๊ตฌ๊ฐ์์๋ ๋ณ์์ ์ ๊ทผํ ์ ์์ด์ ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
์ด๋ก ์ธํด let
๊ณผ const
๋ var
๋ณด๋ค ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์๊ณ
์์ธก ๋ถ๊ฐ๋ฅํ ๋์์ ๋ฐฉ์งํ ์ ์๋ค.
โ๏ธ ์ฐธ๊ณ ) ๋ณ์ ์ ์ธ ๊ถ์ฅ
const userName = "๊น์ฒ ์"; // ์ผ๋ฐ ๋ณ์
const MAX_RETRY_COUNT = 3; // ์์
let currentCount = 0; // ์ฌํ ๋น์ด ํ์ํ ๋ณ์
- ๊ธฐ๋ณธ์ ์ผ๋ก
const
๋ฅผ ์ฐ์ ์ฌ์ฉํ๋ค. - ๊ฐ์ ์ฌํ ๋น์ด ํ์ํ ๊ฒฝ์ฐ์๋ง
let
์ ์ฌ์ฉํ๋ค. var
๋ ์ฌ์ฉํ์ง ์๋๋ค.- ๋ณ์๋ ์นด๋ฉ์ผ์ด์ค(camelCase), ์์๋ ๋๋ฌธ์+์ค๋ค์ดํฌ ์ผ์ด์ค(UPPER_SNAKE_CASE)๋ก ๊ตฌ๋ถํ๋ค.
โ ์ ๋ฆฌ
๊ตฌ๋ถ | var | let | const |
์ค์ฝํ | ํจ์ ์ค์ฝํ | ๋ธ๋ก ์ค์ฝํ | ๋ธ๋ก ์ค์ฝํ |
์ค๋ณต ์ ์ธ | ํ์ฉ | ๋ถ๊ฐ | ๋ถ๊ฐ |
์ฌํ ๋น | ๊ฐ๋ฅ | ๊ฐ๋ฅ | ๋ถ๊ฐ |
ํธ์ด์คํ | ์ ์ธ + undefined ์ด๊ธฐํ | ์ ์ธ๋ง, TDZ ์ ์ฉ | ์ ์ธ๋ง, TDZ ์ ์ฉ |
๐ ์ฐธ๊ณ ์๋ฃ
https://ko.javascript.info/variables
๋ณ์์ ์์
ko.javascript.info
๐ ํธ์ด์คํ (Hoisting) ๋ฐ์ ์๋ฆฌ๋ฅผ ์์๋ณด์
์๋ฐ์คํฌ๋ฆฝํธ ํธ์ด์คํ (Hoisting) ์๋ฐ์คํฌ๋ฆฝํธ์์ ํธ์ด์คํ (Hoisting)์ ๋ณ์ ์ ์ธ๊ณผ ํจ์ ์ ์ธ์ ์ฝ๋์ ๋งจ ์๋ก ๋์ด์ฌ๋ ค์ง๋ ํ์์ ์ผ์ปซ๋๋ค. ๊ทธ๋์ ๊ฐ๋ฐ์๊ฐ ์ด๋ ๋ผ์ธ ์์น์ ์ฝ๋๋ฅผ ์ ์ธ
inpa.tistory.com
https://ccomccomhan.tistory.com/288
[JS] - TDZ(Temporal Dead Zone)์ด๋? ๊ฐ๋จํ๊ณ ์ฝ๊ฒ ์ดํดํ๊ธฐ (์์ ์ฝ๋, ์์ ์ฌ๊ฐ ์ง๋๋?)
๐งน ๊ฐ๋จ์ ๋ฆฌ TDZ๋? ์์์ฌ๊ฐ์ง๋๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ ๋ณ์๊ฐ ์ ์ธ๋๊ธฐ ์ ์ ์ฝ๋ ์์ญ์ ๋งํ๋ค. JS์๋ง ์๋ ๊ฐ๋ ์ด๋ค. (์์ธํ ๋ด์ฉ์ ์๋์ฐธ๊ณ ๐) ๐ฅก TDZ๋? ๋ณ์๊ฐ ์ ์ธ๋์์ง๋ง ์์ง ์ด๊ธฐํ ๋
ccomccomhan.tistory.com